涉及小部件时如何延迟功能的一部分?

时间:2019-11-08 18:31:03

标签: python tkinter

(对不起,英语不好) 你好!我是编程新手。我在使用“之后”方法时遇到了麻烦,我在使用Tkinter。

因此,我希望一个函数执行一部分代码,然后延迟其余代码,但它只是冻结并立即执行所有操作。

def click1 ():
    entered_text=textentry.get()
    textentry.delete(0, "end")
    try:
        rasp1 = inputs[entered_text]
    except:
        rasp1 = "Hello, " + entered_text + "!"
    textentry.destroy()
    enter.destroy()
    tk.Label(root,
             text=entered_text + " <<",
             fg="white",
             bg="#333333",
             #aspect=1000,
             justify="left",
             font=courier) .grid(column=1, sticky="e")
    root.after(3000)
    Rasp1 = tk.Message(root,
                       text=">> " + rasp1,
                       fg="#00ff00",
                       bg="#333333",
                       aspect=800,
                       justify="left",
                       font=courier)
    Rasp1.grid(column=1, sticky="w")

正如我在其他程序上所见,我试图将回调函数编写为函数,但这会产生错误:

Exception in Tkinter callback
Traceback (most recent call last):
  File "C:\Python27\Lib\lib-tk\Tkinter.py", line 1547, in __call__
    return self.func(*args)
  File "C:\Python27\Lib\lib-tk\Tkinter.py", line 596, in callit
    func(*args)
  File "C:\create\Jim(grid).exe.py", line 38, in click1
    entered_text=textentry.get()
  File "C:\Python27\Lib\lib-tk\Tkinter.py", line 2518, in get
    return self.tk.call(self._w, 'get')
TclError: invalid command name ".31959040"

1 个答案:

答案 0 :(得分:0)

我在猜测您想要什么,但是我认为下面的代码会有所帮助。

您的追随者必须为root.after(3000, callback)。我已将Rasp1...代码移到函数do_after中,执行root.after 3秒后,root会调用它。 after的要点是它不会延迟GUI中任何内容的执行。它允许GUI的其余部分保持活动状态,以进行文本输入,单击等操作,而程序会延迟开始执行其回调。

import tkinter as tk

def click1 ():
    global rasp1
    entered_text=textentry.get()
    textentry.delete(0, "end")
    rasp1 = "Hello, " + entered_text + "!"
    textentry.destroy()
    enter.destroy()
    tk.Label(root,
             text=entered_text + " <<",
             fg="white",
             bg="#333333",
             #aspect=1000,
             justify="left").grid(row = 2, column=1, sticky="e")
    root.after(3000, do_after )

def do_after():
    Rasp1 = tk.Message(root,
                       text=">> " + rasp1,
                       fg="#00ff00",
                       bg="#333333",
                       aspect=800,
                       justify="left")
    Rasp1.grid(row=2, column=0, sticky="w")

root = tk.Tk()
textentry = tk.Entry(root)
textentry.grid()
enter = tk.Button(root, command = click1, text = " Test " )
enter.grid()
root.mainloop()