我试图创建一个简单的应用程序用于插图目的。这个想法如下:
创建一个应用程序,它将运行仅与所选课程相关的脚本文件(单选按钮)。所以,我创建列出主题的单选按钮(点击)。选择主题后,用户必须点击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()
答案 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
是全局的。
我认为如果你解决了这些问题,你就会更接近你正在寻找的东西。祝你好运。!