gpt4 book ai didi

python - TKinter 中函数执行期间拒绝事件

转载 作者:行者123 更新时间:2023-12-01 01:33:01 24 4
gpt4 key购买 nike

我有一个 TKinter 应用程序 (Python),它可以对按钮按下和键盘输入使用react。但是,在这些事件之一之后调用的函数可能需要一些时间才能执行。我希望 GUI 在函数执行时拒绝所有用户输入。 [编辑:只是想澄清一下:所有用户输入是指应用程序中存在的任何和所有按钮/键绑定(bind) - 我不仅仅是试图拒绝来自特定按钮的事件。]

这是一个非常简单的示例,显示 TKinter 目前似乎将事件添加到队列中,该队列在处理每个事件后执行。每次按下按钮时,按钮中的文本都会附加一个零。但是,如果在文本读取 00 时按下按钮,则该函数需要一段时间才能执行(我放入 self.after(3000)),并且如果在该函数执行时按下按钮执行,然后每一次按下都会注册。因此,如果我在 3 秒内按下按钮 5 次,使其“停止”,那么每次点击都会记录下来,最终我会在按钮上看到 0000000

import tkinter as tk

# To demonstrate that keystrokes/button clicks do register while a function is executing (and then subsequently fire)
class Application(tk.Frame):
def __init__(self, master=None):
super().__init__(master)

# Build the app
self.text = tk.StringVar()
self.pack()
self.create_widgets()

def create_widgets(self):
self.btn = tk.Button(self, textvariable=self.text, command=self.DoSomething, padx=30, pady=30)
self.btn.grid(row=0, column=0)
self.text.set('0')

def DoSomething(self):
# self.RejectEventsWhileThisFuncExecutes()
old_msg = self.text.get()
if old_msg == '00':
self.after(3000)
self.text.set(old_msg + '0')
# self.BeginAcceptingEventsAgain()

root = tk.Tk()
app = Application(master=root)
app.mainloop()

基本上,我想要的是我可以在函数的开头和结尾处调用 DoSomething() ,比如 self.RejectEventsWhileThisFuncExecutes()self.BeginAcceptingEventsAgain(),这将确保函数执行时不会注册任何点击。

最佳答案

一个常见的策略是创建一个不可见的小部件(例如:窗口一角的 1x1 框架),并在该小部件上进行抓取(即:调用grab_set)。这会导致所有事件都集中到该小部件。只要该窗口上没有绑定(bind),最终效果就是事件被忽略。您只需在删除抓取之前刷新事件队列(调用 update 方法)即可。

关于python - TKinter 中函数执行期间拒绝事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52649477/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com