2013-04-17 18 views
1

我使用Tkinter的Python 3中创建一个程序,我卡住了... 我有一个由按下按钮触发无限循环:款待按钮释放键盘中断的Tkinter

def task13(): 
    while True: 
     #do stuff 

... 

button13 = Button(root, width=25, text="13", command=task13) 
goButton.pack(side=LEFT,anchor="n") 

怎么可能我终止button13的释放task13?是否有“键盘中断”代码或可以修改循环?

回答

3

无法中断正在运行的功能。但是,您可以为该按钮设置一个绑定,并在该绑定中设置一个标志。然后,在task13中,您可以检查循环顶部的该标志。您还需要绑定<ButtonPress-1>才能启动循环,因为command与释放鼠标按钮绑定在按钮构件上相关。

这只会在循环中处理服务事件时才起作用。如果#do stuff阻止了事件循环,那么除了在单独的线程或进程中运行该代码外,您无能为力。

+0

我是想真正实施这一解决方案,但它不工作对我来说...(我有一个'root.update_idletasks()')在我的无限while循环中,但仍然不起作用。 ''似乎没有被识别... – mgilson

+0

另外,当我使用'Button'时,回调似乎甚至不会被调用,直到按钮已被释放。 – mgilson

+0

下面是一个pastebin,如果你有兴趣:http://pastebin.com/fQ6JHdd0 – mgilson

1

按钮有"<Button-1><ButtonRelease-1>事件:

from tkinter import * 

def press(*args): 
    print('press') 
    global pressed 
    pressed = True 
    master.after(0, loop) 

def release(*args): 
    print('release') 
    global pressed 
    pressed = False 

def loop(): 
    if pressed: 
     print('loop') 
     # Infinite loop without delay is bad idea. 
     master.after(250, loop) 

master = Tk() 
pressed = False 

b = Button(master, text="OK") 
b.bind("<Button-1>", press) 
b.bind("<ButtonRelease-1>", release) 
b.pack() 
mainloop() 
+0

请注意,重新注册一个要再次运行的函数与一个无限循环... – mgilson

+0

我知道,但这是最简单的方法。 – kalgasnik