Python跨脚本传递tkinter输入值:报错及重复运行问题求助
问题:在两个Tkinter脚本间传递输入框值并避免窗口重复打开
原始代码
Script1.py
import tkinter as tk def button_click(): exec(open("script2.py").read()) def main(): global entry_field root = tk.Tk() entry_field = tk.Entry(root) entry_field.pack() button = tk.Button(root, text="Click me!", command=button_click) button.pack() root.mainloop() if __name__ == "__main__": main()
Script2.py
import tkinter as tk import script1 root = tk.Tk() label = tk.Label(root, text=script1.entry_field.get()) label.pack() root.mainloop()
问题现象
- 运行Script1点击按钮时触发报错:
Exception in Tkinter callback Traceback (most recent call last): File "C:\Users\User\AppData\Local\Programs\Python\Python311\Lib\tkinter\__init__.py", line 1948, in __call__ return self.func(*args) ^^^^^^^^^^^^^^^^ File "c:\Users\User\Desktop\Skaala\Skaala project\Test folder\script1.py", line 4, in button_click exec(open("script2.py").read()) File "<string>", line 6, in <module> AttributeError: module 'script1' has no attribute 'entry_field'
- 移除
if __name__ == "__main__"语句后,虽能获取输入值,但Script1运行时会打开两个窗口——因为Script2导入Script1时会重新执行整个脚本。
问题分析
- 报错原因:
entry_field是在main()函数内定义的全局变量,仅当Script1作为主程序运行时才会执行main()初始化该变量;Script2导入Script1时,entry_field未被初始化,因此触发属性不存在的错误。 - 窗口重复打开:移除
if __name__ == "__main__"后,Script2导入Script1时会直接执行main(),导致额外创建一个窗口。
解决方案
方案1:通过参数传递值,避免循环依赖
修改两个脚本的结构,将输入值直接作为参数传递给Script2的显示逻辑,无需Script2导入Script1:
Script1.py
import tkinter as tk import script2 def button_click(): input_value = entry_field.get() script2.show_value(input_value) def main(): global entry_field root = tk.Tk() entry_field = tk.Entry(root) entry_field.pack() button = tk.Button(root, text="Click me!", command=button_click) button.pack() root.mainloop() if __name__ == "__main__": main()
Script2.py
import tkinter as tk def show_value(value): root = tk.Tk() label = tk.Label(root, text=value) label.pack() root.mainloop()
方案2:通过函数封装值获取逻辑,避免导入时触发窗口创建
保留导入方式,但通过函数封装值的获取逻辑,同时确保Script2导入时不会触发Script1的窗口初始化:
Script1.py
import tkinter as tk entry_field = None def get_input_value(): return entry_field.get() if entry_field else "" def button_click(): import script2 script2.show_label() def main(): global entry_field root = tk.Tk() entry_field = tk.Entry(root) entry_field.pack() button = tk.Button(root, text="Click me!", command=button_click) button.pack() root.mainloop() if __name__ == "__main__": main()
Script2.py
import tkinter as tk import script1 def show_label(): root = tk.Tk() label = tk.Label(root, text=script1.get_input_value()) label.pack() root.mainloop()
以上两种方案均可实现输入值的传递,同时避免窗口重复打开的问题。
内容的提问来源于stack exchange,提问作者Vitaliy
相关产品推荐
相关产品推荐

