当涉及小部件时,如何延迟函数的一部分?

2024-09-22 16:38:13 发布

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

(抱歉英语不好) 你好我是编程新手。我在使用“after”方法时遇到了一些问题,我使用了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"

Tags: 函数textinpygettkinterlineroot
1条回答
网友
1楼 · 发布于 2024-09-22 16:38:13

我猜你想要什么,但我认为下面的代码会有所帮助

您的after需要是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()

相关问题 更多 >