在上次按tkin键后的时间段后调用函数

2024-09-29 23:30:13 发布

您现在位置:Python中文网/ 问答频道 /正文

我在Python的tkinter应用程序中有一个条目。如果用户更改条目内容,程序将通过onValidate函数作出反应。你知道吗

现在,如果用户有一段时间没有按任何键,我想选择输入字段中的所有文本。你知道吗

下面我尝试在1000ms后使用after函数select_all_text,但似乎不起作用。你知道吗

import tkinter as tk  

class MyEntry(tk.Frame):

    def __init__(self, parent):
        tk.Frame.__init__(self, parent)

        self.vcmd = (self.register(self.onValidate),
                        '%d', '%i', '%P', '%s', '%S', '%v', '%V', '%W')

        self.entry = tk.Entry(self, validate="key", validatecommand=self.vcmd)
        self.entry.pack(side="top", fill="x")

        self.select_all_text()

    def select_all_text(self):
        self.entry.focus()
        self.entry.select_range(0,'end')

    def onValidate(self, d, i, P, s, S, v, V, W):
        self.root.after(1000, self.select_all_text)

        return True

if __name__ == "__main__":
    root = tk.Tk()
    MyEntry(root).pack(fill="both", expand=True)

    root.mainloop()

另外,每次按下新键时,计时器都应该重置,这样select_all_text只有在上次按键后经过足够长的时间后才会被调用。在下面的示例中,每次按键后都会调用select_all_text,这不是期望的行为。你知道吗

我在想,它可以跟踪自上次按键以来的时间,如果超过某个阈值,则会调用函数。这种方法也能解决问题。你知道吗

如果在tkinter中最后一次按键已经过了足够长的时间,如何调用函数?你知道吗


Tags: 函数text用户selftkinterdef时间条目
1条回答
网友
1楼 · 发布于 2024-09-29 23:30:13

当您保留对after返回的id的引用时,可以使用after_cancel取消它。使用此功能,您可以取消预定功能并在每次按键时重新安排:

class MyEntry(tk.Frame):

    def __init__(self, parent):
        tk.Frame.__init__(self, parent)
        self.parent = parent
        self.after_id = None

        ...

    def onValidate(self, d, i, P, s, S, v, V, W):
        if self.after_id:
            self.parent.after_cancel(self.after_id)
        self.after_id = self.parent.after(1000, self.select_all_text)

        return True

注意,我还保存了根窗口,您将它作为参数传递给self.parent中的MyEntry,并使用它来调用after。你知道吗


另外,您不需要使用条目的validatecommand命令来执行此操作(当然,如果您已经使用了validatecommand,您也可以这样做)。您可以将该功能绑定到每个按键:

class MyEntry(tk.Frame):

    def __init__(self, parent):
        tk.Frame.__init__(self, parent)
        self.parent = parent
        self.after_id = None

        self.entry = tk.Entry(self)
        self.entry.bind('<Key>', self.entry_keypress)

        ...

    def entry_keypress(self, e):
        print(self.after_id)
        if self.after_id:
            self.parent.after_cancel(self.after_id)
        self.after_id = self.parent.after(1000, self.select_all_text)

相关问题 更多 >

    热门问题