我正在尝试使用Tkinter创建一个简单的表单,一旦按下按钮就会执行操作。如何“按”按下按钮?
我创建了一个回调方法,它会在按下按钮时更改状态变量,但是在按下按钮后无法弄清楚如何在主循环中引起操作。
我试图使用while循环(在绘制按钮之后)来检查状态变量的值,但是当我这样做时,循环执行,但我的GUI元素不会出现在屏幕上。 (如果我使用for循环,它们会出现,但我认为这不适用于此。)
如何“等待”状态更改为“状态”变量?或者是否有一种内置的方法可以做到这一点,我错过了?
(实际代码稍微复杂一些 - 类似于答案here中的方法(但没有所有按钮都在一个页面上) - 但我认为原理仍然是相同的(如何听将状态更改为其中一个对象变量。)
from Tkinter import *
master = Tk()
def callback():
status = 0
print status
status = 1
myB = Button(text="Enter", command=callback)
myB.pack()
print status
# while True:
# if status == 0:
# print "button was clicked"
mainloop()
答案 0 :(得分:3)
您可以使用after(time_ms, function_name)
重复调用您的函数(但没有while True
)。
import Tkinter as tk
# --- functions ---
def check():
if status != 1:
print 'check:', status
# check again after 100ms
master.after(100, check) # filename without ()
def callback():
global status # because you use `=`
status = 0
print 'callback:', status
# --- main ---
status = 1
master = tk.Tk()
myB = tk.Button(master, text="Enter", command=callback)
myB.pack()
# check after 100ms
master.after(100, check) # filename without ()
# or call immediately
# check()
tk.mainloop()
或者,当对象更改值时,您可以使用对象IntVar
,StringVar
等和trace
来调用函数。
BTW:Label
可以在StringVar
更改值时自动更改其文字 - 它不需要trace
。
import Tkinter as tk
# --- functions ---
def check(arg1, arg2, arg3): # 3 args always send by `trace`
print 'check:', status.get() # always use `get`
def callback():
# no needed `global status`
status.set(0) # always use `set` instead of `=`
print 'callback:', status.get() # always use `get`
# --- main ---
master = tk.Tk()
status = tk.IntVar() # now always use get(), set()
status.set(1)
status.trace('w', check) # w - write (`set` was used)
# use IntVar in Label
l = tk.Label(master, textvariable=status)
l.pack()
b = tk.Button(master, text="Enter", command=callback)
b.pack()
tk.mainloop()
请参阅:The Variable Classes (BooleanVar, DoubleVar, IntVar, StringVar)