在tkraise之后循环?

时间:2016-01-30 23:27:41

标签: python tkinter

我正在尝试使用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()

1 个答案:

答案 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()

或者,当对象更改值时,您可以使用对象IntVarStringVar等和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)