使用exec从tkinter(GUI)执行文件

时间:2015-06-25 04:24:30

标签: python tkinter

我正在使用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”按钮中放入相同的命令时,它不起作用。

1 个答案:

答案 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的大部分文档和教程仍然适用。