【问题标题】:Treat button release as keyboard interrupt tkinter将按钮释放视为键盘中断 tkinter
【发布时间】:2013-04-17 17:24:51
【问题描述】:

我在 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?是否有“键盘中断”代码或者我可以修改循环吗?

【问题讨论】:

    标签: python button tkinter release keyboardinterrupt


    【解决方案1】:

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

    这只有在循环中为事件提供服务时才有效。如果#do stuff 阻塞了事件循环,则您无能为力,只能在单独的线程或进程中运行该代码。

    【讨论】:

    • 我试图实际实现这个解决方案,但它对我没有用......(我有一个root.update_idletasks())在我的无限循环中,但似乎仍然没有工作。 '' 似乎没有被识别...
    • 另外,当我使用Button 时,在实际释放按钮之前,似乎甚至不会调用回调。
    • update_idletasks 仅更新 idle 任务,例如重新绘制屏幕。它不处理任何用户生成的事件。
    • 你用什么来处理用户生成的事件?
    • @mgilson: update,但通常如果您需要update,则意味着您做错了(例如在 GUI 中嵌入无限循环)
    【解决方案2】:

    按钮有"<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()
    

    【讨论】:

    • 请注意,重新注册要再次运行的函数与无限循环有很大不同...
    • 我知道,但这是最简单的方法。
    猜你喜欢
    • 2015-01-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-08
    • 2021-04-18
    • 2020-10-26
    • 1970-01-01
    相关资源
    最近更新 更多