Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/363.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 将按钮释放视为键盘中断tkinter_Python_Button_Tkinter_Release_Keyboardinterrupt - Fatal编程技术网

Python 将按钮释放视为键盘中断tkinter

Python 将按钮释放视为键盘中断tkinter,python,button,tkinter,release,keyboardinterrupt,Python,Button,Tkinter,Release,Keyboardinterrupt,我正在使用Python3中的tkinter创建一个程序,我被卡住了。。。 我有一个由按下按钮触发的无限循环: def task13(): while True: #do stuff ... button13 = Button(root, width=25, text="13", command=task13) goButton.pack(side=LEFT,anchor="n") 释放按钮13时,如何终止task13?是否有“键盘中断”代码,或者是否可以修改循环?无

我正在使用Python3中的tkinter创建一个程序,我被卡住了。。。 我有一个由按下按钮触发的无限循环:

def task13():
    while True:
        #do stuff

...

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

释放按钮13时,如何终止task13?是否有“键盘中断”代码,或者是否可以修改循环?

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


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

无法中断正在运行的函数。但是,您可以在按钮的
上设置一个绑定,并在该绑定中设置一个标志。然后,在
task13
中,您可以检查循环顶部的标志。您还需要在
上绑定以启动循环,因为
命令
与在按钮小部件上释放鼠标按钮相关联

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

按钮具有
事件:

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()
从tkinter导入*
def压力(*参数):
打印(“按”)
全球压力
按下=真
主.后(0,循环)
def释放(*args):
打印(‘发布’)
全球压力
按下=错误
def loop():
如果按下:
打印('循环')
#没有延迟的无限循环是个坏主意。
主。后(250,循环)
master=Tk()
按下=错误
b=按钮(主控,text=“确定”)
b、 绑定(“,按)
b、 绑定(“,释放)
b、 包()
mainloop()
按钮具有
事件:

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()
从tkinter导入*
def压力(*参数):
打印(“按”)
全球压力
按下=真
主.后(0,循环)
def释放(*args):
打印(‘发布’)
全球压力
按下=错误
def loop():
如果按下:
打印('循环')
#没有延迟的无限循环是个坏主意。
主。后(250,循环)
master=Tk()
按下=错误
b=按钮(主控,text=“确定”)
b、 绑定(“,按)
b、 绑定(“,释放)
b、 包()
mainloop()

我曾试图实际实施此解决方案,但对我来说效果不佳。。。(我的无限while循环中有一个
root.update_idletasks()
),但似乎仍然不起作用。“”似乎没有被识别……而且,当我使用
按钮时,回调似乎在按钮实际释放之前都不会被调用。
update\u idletasks
只更新空闲任务,例如重新绘制屏幕。它不处理任何用户生成的事件。您使用什么来处理用户生成的事件?@mgilson:
更新
,但通常如果您需要
更新
,这意味着您做了一些错误的事情(例如在GUI中嵌入无限循环)。我试图实际实现此解决方案,但它对我来说不起作用。。。(我的无限while循环中有一个
root.update_idletasks()
),但似乎仍然不起作用。“”似乎没有被识别……而且,当我使用
按钮时,回调似乎在按钮实际释放之前都不会被调用。
update\u idletasks
只更新空闲任务,例如重新绘制屏幕。它不处理任何用户生成的事件。您使用什么来处理用户生成的事件?@mgilson:
update
,但通常如果您需要
update
,则表示您做错了什么(例如在GUI中嵌入无限循环)请注意,重新注册要再次运行的函数与无限循环明显不同…我知道,但这是最简单的方法。请注意,重新注册要再次运行的函数与无限循环明显不同…我知道,但这是最简单的方法。