2013-07-20 41 views
0

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

但是,当我运行我的代码时,我得到4个带有'None'的messageboxes。点击确定之后,我会看到一个只有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)在你的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,而不是returnexecute_script()功能?

7)在你所有的功能中,你需要确保been_clicked是全球性的。

我认为如果你解决了这些问题,你会更接近获得你要找的东西。祝你好运。!

+0

由于',command = execute_script()'是_calling_'execute_script',奇怪的是'for name in been_cliked'问题不会导致'NameError:全局名''was_cliked'未定义'错误。 – martineau

+0

我同意。原因是他有'yield'而不是'return'。使用'yield'不会导致'NameError'被引发。不知道这是为什么。 – Symmitchry

+1

啊,答案在这里:http://stackoverflow.com/questions/231767/the-python-yield-keyword-explained 'yield'会导致一个生成器被返回,但直到使用生成的代码,代码尚未运行。 – Symmitchry

相关问题