0

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

但是,当我运行我的代码时,我得到 4 个消息框,里面写着“无”。单击确定后,我得到一个只有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()
4

1 回答 1

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是全局的。

我认为,如果您解决了这些问题,您将更接近于获得所需的内容。祝你好运。!

于 2013-07-20T15:17:14.837 回答