英文:
python tkinter waiting for an input to be inputted by user
问题
我有一个代码片段。输入小部件创建自己并设置文本,然后等待若干秒后销毁自己。
entry_var_temporary = tk.StringVar()
entry_var_temporary.set(varsoundTitle_usernameHeroContainer)
entry_shtname_temp = tk.Entry(canvas2, width=30, textvariable=entry_var_temporary)
entry_shtname_temp.pack()
entry_shtname_temp.focus_set()
root.update()
time.sleep(10)
entry_shtname_temp.destroy()
root.update()
我已经等待了10秒,让用户修改文本,如果需要的话。但我发现,time.sleep
不允许修改输入小部件。如何解决这个问题?
通过使用 wait.window()
,我意识到可以在小部件内编辑文本,但我的问题是,这不是强制性的。因此,如果用户没有在其中输入任何文本,那么在10秒后它需要被销毁。
英文:
I have a code snippet. Entry widget creates itself with text, then waits seconds then destroys itself.
entry_var_temporary = tk.StringVar()
entry_var_temporary.set(varsoundTitle_usernameHeroContainer)
entry_shtname_temp=tk.Entry(canvas2,width=30,textvariable=entry_var_temporary)
entry_shtname_temp.pack()
entry_shtname_temp.focus_set()
root.update()
time.sleep(10)
entry_shtname_temp.destroy()
root.update()
I have put 10 seconds to wait, and let user to modify the text, if it wants so. But as I see, time.sleep does not let the entry widget to be modified.
How can I get around this problem?
With wait.window()
I realized I can edit text inside widget, but my problem is, it is not compulsory. So, if user doesn't put any text on it, it then after 10 sec needs to be destroyed
答案1
得分: 1
使用after
方法与destroy
方法作为回调函数。
使用root.after
而不是time.sleep
的主要原因是time.sleep
会停止线程,导致代码完全停止,而root.after
是线程安全的,因为它是基于回调实现的。
您的小部件将在设置的一段时间后自动销毁。
例如:
import tkinter as tk
root = tk.Tk()
entry_var_temporary = tk.StringVar()
entry = tk.Entry(root, textvariable=entry_var_temporary)
entry.pack()
root.after(10000, entry.destroy) # 10000毫秒
root.mainloop()
英文:
Use the after
method with the destroy
method as the callback.
The main reason to use root.after
vs time.sleep
is the time.sleep
stops the thread causing the code to completely stop compared to root.after
which is thread-safe because it is implemented in terms of call.
Your widget will destroy itself automatically after a set amount of time.
for example:
import tkinter as tk
root = tk.Tk()
entry_var_temporary = tk.StringVar()
entry = tk.Entry(root, textvariable=entry_var_temporary)
entry.pack()
root.after(10000, entry.destroy) # 10000 milliseconds
root.mainloop()
答案2
得分: 1
这似乎是以前的问题的扩展,您只需要在该示例中添加一行代码,以便在10秒后自动删除输入框小部件。
在以下示例中,请注意我如何使用after
在10秒内销毁窗口。这个调用必须在等待窗口之前执行。这是我在您以前的问题中提供的示例,只是添加了一个新的语句:
entry_var = tk.StringVar()
new_sheetname_entryBox = tk.Entry(canvas2, width=30, textvariable=entry_var)
new_sheetname_entryBox.pack()
new_sheetname_entryBox.bind("<Return>", lambda event: new_sheetname_entryBox.destroy())
new_sheetname_entryBox.focus_set()
# 等待输入小部件被删除,但如果用户不响应,自动在10秒后删除它。
root.after(10000, new_sheetname_entryBox.destroy)
new_sheetname_entryBox.wait_window()
英文:
This seems to be an extension of a previous question you asked. You only need to add one more line of code to that example in order to automatically delete the entry widget after 10 seconds.
In the following example, notice how I use after
to destroy the window in 10 seconds. This call must be done before waiting for the window. This is the example I gave in your previous question, with just that one new statement added:
entry_var = tk.StringVar()
new_sheetname_entryBox=tk.Entry(canvas2,width=30, textvariable=entry_var)
new_sheetname_entryBox.pack()
new_sheetname_entryBox.bind("<Return>", lambda event: new_sheetname_entryBox.destroy())
new_sheetname_entryBox.focus_set()
# wait for the entry widget to be deleted, but automatically
# delete it after 10 seconds if the user doesn't respond.
root.after(10000, new_sheetname_entryBox.destroy)
new_sheetname_entryBox.wait_window()
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论