2016-01-30 5 views
2

Я пытаюсь создать простую форму с помощью Tkinter, которая будет делать действие после нажатия кнопки. Как я могу «прослушать» нажатие кнопки?Пока цикл после tkraise?

Я создал метод обратного вызова, который будет изменять переменную статуса при нажатии кнопки, но не может понять, как вызвать действие в моем основном цикле после нажатия кнопки.

Я попытался использовать цикл while (после рисования кнопки), чтобы проверить значение переменной состояния, но когда я это делаю, цикл выполняется, но мои элементы GUI не отображаются на экране. (Если я использую цикл for, они появляются, но я не думаю, что это сработает для этого.)

Как мне «ждать» изменения состояния в моей переменной «status»? Или есть встроенный способ сделать это, что мне не хватает?

(Фактический код немного сложнее - аналогично подходу в ответе 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() 
+2

'MainLoop()' запустить программу и запустить до вы закроете программу. Вы не можете использовать 'while loop',' sleep' или другие длительные функции в Tkinter (или других GUI). – furas

+0

@furas - спасибо. Есть ли другой способ «прослушать» изменение переменной? – user3092118

+0

Вы можете использовать 'tkinter.IntVar' для создания специальной переменной объекта a, а затем использовать функцию' trace' для вызова, когда это значение объекта изменяется. – furas

ответ

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)

Смежные вопросы