创建Python tkinter的简单应用程序

时间:2013-07-20 14:13:15

标签: python user-interface tkinter

我试图创建一个简单的应用程序用于插图目的。这个想法如下: 创建一个应用程序,它将运行仅与所选课程相关的脚本文件(单选按钮)。所以,我创建列出主题的单选按钮(点击)。选择主题后,用户必须点击Enter按钮。这应该运行所选主题的所有.py个文件(execute_script函数)。

然而,当我运行我的代码时,我得到了4个内部写有'None'的消息框。单击确定后,我得到一个只有enter按钮的方形窗口。我该怎么做才能解决这个问题?

def check(file_name, relStatus):   
    radioValue = relStatus.get()
    tkMessageBox.showinfo('You checked', radioValue)
    been_clicked.append(file_name)   
    return

def execute_script():
    for name in been_cliked:
        subprocess.Popen(['python', 'C:\Users\Max\Subjects\{}'.format(name)])

    yield


def main():

    #Create application
    app = Tk()
    app.title('Coursework')
    app.geometry('450x300+200+200')

    #Header
    labelText = StringVar()
    labelText.set('Select subjects')

    #Dictionary with names
    product_names = {}
    names = []
    file_name = []
    names = ['Math', 'Science', 'English', 'French']
    file_name = ['calc.py', 'physics.py', 'grammar.py', 'livre.py']
    product_names = OrderedDict(zip(names, file_name))

    #Create radio buttons
    global been_clicked
    been_clicked = []
    relStatus = StringVar()
    relStatus.set(None)
    for name,file_name in product_names.iteritems():
        radio1 = Radiobutton(app, text=name, value=name, \
                         variable=relStatus, command=check(file_name, relStatus))

    button = Button(app, text='Click Here', width=20, command=execute_script())
    button.pack(side='bottom', padx=15, pady=15)

    app.mainloop()


if __name__ == '__main__': main()

1 个答案:

答案 0 :(得分:4)

您的脚本存在一些问题:

1)execute_script()函数中的拼写错误:for name in been_cliked

2)创建单选按钮时,实际上正在调用 check()函数。这就是为什么你在运行你的程序时会看到弹出的窗口。

你需要改变这个:

radio1 = Radiobutton(app, text=name, value=name, \
                     variable=relStatus, command=check(file_name, relStatus))

到此:

radio1 = Radiobutton(app, text=name, value=name, \
                     variable=relStatus, command=check)

了解check不再有括号?这意味着你将函数名称作为参数传递,而不是实际调用函数。当然,你会发现一个直接的问题是你不能再将参数传递给你的回调函数!这是一个更大的问题。以下是一些帮助您入门的链接:

以下是解决方案:

改变这个:

command=check(file_name, reStatus)

到此:

command = lambda: check(file_name, relStatus)

3)你实际上并没有pack()你的单选按钮。在for循环中创建单选按钮后添加类似的内容:radio1.pack(side='top')

4)您的Click Here按钮的回调存在同样的问题。您需要更改命令以不调用该函数,但只需参考它:command = execute_script

5)在execute_script()中,请确保import subprocessing

6)您确定在yield函数中想要return而不是execute_script()吗?

7)在所有功能中,您需要确保been_clicked是全局的。

我认为如果你解决了这些问题,你就会更接近你正在寻找的东西。祝你好运。!