Python tkinter如何访问函数内Entry的值并延迟执行依赖代码
问题原因
你代码的执行顺序是先运行全局位置的print(vm),再启动tk主循环等待用户操作,这时候vm还没被entbm函数赋值,自然会报未定义错误。要实现"等vm定义完成再执行操作",只需要把依赖vm的逻辑放到entbm函数里,等用户点击确认按钮、vm生成之后自动触发就行。
修正方案
- 删掉全局位置的
print(vm),把它移到entbm函数里vm赋值完成的位置 - 如果后续还有其他依赖
vm的业务逻辑,也都可以放在这个位置执行
调整后的核心代码示例
import tkinter as tk # 补全rgb_hack函数示例,可替换为你自己的实现 def rgb_hack(rgb): return "#%02x%02x%02x" % rgb def open2(): global top2 top2 = tk.Toplevel() top2.title('second window') lbl2 = tk.Label(top2, text='question 1') lbl2.place(y=50, x=150) global ent2 ent2 = tk.Entry(top2, bd=0, bg=rgb_hack((255, 255, 255))) ent2.place(y=100, x=150) top2.config(bg=rgb_hack((163, 236, 165))) top2.geometry("450x250") btnbm = tk.Button(top2, text='ok', command=entbm).pack() root.withdraw() # 补全open1函数示例,可替换为你自己的实现 def open1(): global top2 top2 = tk.Toplevel() top2.title('second window') lbl2 = tk.Label(top2, text='question 2') lbl2.place(y=50, x=150) global ent2 ent2 = tk.Entry(top2, bd=0, bg=rgb_hack((255, 255, 255))) ent2.place(y=100, x=150) top2.config(bg=rgb_hack((163, 236, 165))) top2.geometry("450x250") btnbm = tk.Button(top2, text='ok', command=entbm).pack() root.withdraw() def entbm(): global vm vm = ent2.get() vm = vm.replace(' ', '').lower() top2.destroy() # 原全局print移到此处,vm赋值完成后自动执行 print(vm) # 后续答题判断、结果展示等依赖vm的逻辑都可以放在此处 return vm root = tk.Tk() root.title('first window') root.geometry("450x250") root.config(bg=rgb_hack((163, 236, 165))) btn1 = tk.Button(root, text="to question 1", command=open1, bd=0, height=2, width=20, bg=rgb_hack((255, 255, 255))) btn1.place(y=50, x=150) btn2 = tk.Button(root, text="to question 2", command=open2, bd=0, height=2, width=20, bg=rgb_hack((255, 255, 255))) btn2.place(y=100, x=150) tk.mainloop()
可选优化
如果你不想使用过多全局变量,可以用类来封装整个答题流程,把vm、窗口组件都做成类的属性,代码可读性和可维护性会更高。
内容的提问来源于stack exchange,提问作者mr_brunan
相关产品推荐
相关产品推荐

