PAGE生成的Python tkinter GUI修改TEntry1状态时意外新建窗口问题
问题原因
- 核心错误出在
disableentry()方法内重复调用了tk.Tk():每调用一次tk.Tk()就会生成一个全新的独立窗口,你在该方法内新生成了窗口和新的Toplevel1实例,修改的自然是新窗口的控件,和原来已经打开的主窗口没有任何关联。 - 未保留原有主窗口对应的
Toplevel1实例的引用,导致无法直接操作原来窗口里的TEntry1控件。 - tkinter的GUI控件操作要求必须在创建控件的线程执行,你当前把GUI放在子线程运行本身不符合tkinter的设计规范,后续还可能出现控件无响应、状态不同步的问题。
修复方案
- 首先修改
vp_start_gui方法,把生成的Toplevel1实例设为全局变量,方便后续调用:
def vp_start_gui(): global val, w, root, top root = tk.Tk() guisetup.set_Tk_var() top = Toplevel1 (root) root.mainloop()
- 修改
disableentry()方法,删除新建窗口的代码,直接操作原有全局的top实例里的控件:
def disableentry(): print("disableentry() start") top.TEntry1.configure(state='disabled')
- 你当前
start_stop方法的逻辑写反了,调整后可以实现点击Start禁用输入框、点击Stop恢复输入框的效果:
def start_stop(): print('PLA_support.start_stop') if (running_status.get() == 0): # 切换到运行模式 button_text.set("Stop") running_status.set(1) guicontrols.disableentry() else: # 切换到停止模式 button_text.set("Start") running_status.set(0) top.TEntry1.configure(state='normal') sys.stdout.flush()
- (可选优化)调整代码结构将tkinter主循环放在主线程运行,业务逻辑放在子线程执行,避免tkinter的线程安全问题。
内容的提问来源于stack exchange,提问作者Straconis
相关产品推荐
相关产品推荐

