我正在使用python 3.4.2,Windows 8.1,我有一个GUI“reload 0.py”,当我按下一个按钮时,它会将两个值相加,并在一个框中显示结果。我有一个带有按钮的另一个GUI“reload1.py”。当我按下“reload1.py”中的按钮时,我想打开并“reload0.py”。
我在按钮
中使用它exec(open("C:\\Users\\me\\Desktop\\rel\\reload0.py").read())
但是我收到以下错误
Exception in Tkinter callback
Traceback (most recent call last):
File "C:\Python34\lib\idlelib\run.py", line 121, in main
seq, request = rpc.request_queue.get(block=True, timeout=0.05)
File "C:\Python34\lib\queue.py", line 175, in get
raise Empty
queue.Empty
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "C:\Python34\lib\tkinter\__init__.py", line 1533, in __call__
return self.func(*args)
File "<string>", line 24, in mOp
NameError: name 'value1' is not defined
如果我单独运行“reload0.py”,它可以工作,如果我把命令放在python shell中,它可以工作,但是当我在“reload1.py”按钮中放入相同的命令时,它不起作用。
答案 0 :(得分:2)
我从来没有见过任何代码回调函数和使用exec的guis所以我无法告诉你为什么它不起作用。
您应该将result0.py中的代码放入类或函数中, 这样你就可以简单地导入函数/类并在回调中使用它
让我们假设下面的代码是result0.py
import tkinter as tk
import tkinter.ttk as ttk
class SomeWindow(tk.Toplevel):
def __init__(self, parent):
tk.Toplevel.__init__(self, parent)
lab1 = ttk.Label(self, text='hihihi')
lab1.pack()
lab2 = tkt.Label(self, text='fdsfsfds')
lab2.pack()
现在在result1.py中我们导入SomeWindow并将其绑定到回调
import tkinter as tk
import tkinter.ttk as ttk
from result0 import SomeWindow
root = tk.Tk()
but = ttk.Button(root, text='press me', command=lambda: SomeWindow(root))
but.pack()
tk.mainloop()
如果您刚开始使用gui编程,您可能需要查看模型视图控制器(MVC)设计模式
http://tkinter.unpythonic.net/wiki/ToyMVC
一些好的tkinter引用是:
http://effbot.org/tkinterbook/
http://infohost.nmt.edu/tcc/help/pubs/tkinter/web/index.html
https://docs.python.org/3/library/tkinter.html#module-tkinter
此外,tkinter 8.6于2015年3月发布,但8.5的大部分文档和教程仍然适用。