我喜欢每秒创建一个对象并逐个显示。但是,下面的代码等待3秒钟并同时显示所有代码。
from tkinter import *
import time
def create():
for i in range(3):
r4=Radiobutton(root, text="Option 1"+str(i), value=1)
r4.pack( anchor = W )
time.sleep(1)
root = Tk()
create()
root.mainloop()
答案 0 :(得分:0)
您可以使用update
来调用对象的刷新。
在使用中,您必须在root.update()
循环中添加第for
行。
答案 1 :(得分:0)
您的代码按原样每秒创建一个对象,但需要显示此对象,并在代码流到达mainloop
时显示。因此,对于观察者来说,看起来一秒钟后根本没有任何物体。
当然,您可以使用sleep
和update
,但要注意 - sleep
会导致窗口无响应,所以可以选择(说实话 - 根本不行),如果你的应用程序没有被绘制而且你在mainloop
之外,但是如果它不是 - 准备一个“冻结”窗口,因为GUI只能在mainloop
重绘自己(一个事件循环,你也可以通过update
与sleep
联系,并try:
import tkinter as tk
except ImportError:
import Tkinter as tk
import time
def create_with_sleep():
for _ in range(3):
tk.Radiobutton(frame_for_sleep, text="Sleep Option").pack(anchor='w')
time.sleep(int(time_entry.get()))
root.update()
def create_with_after(times=3):
if times != 0:
tk.Radiobutton(frame_for_after, text="After Option").pack(anchor='w')
times -= 1
root.after(int(time_entry.get()) * 1000, lambda: create_with_after(times))
root = tk.Tk()
test_yard_frame = tk.Frame(root)
frame_for_sleep = tk.Frame(test_yard_frame)
frame_for_after = tk.Frame(test_yard_frame)
test_yard_frame.pack()
frame_for_sleep.pack(side='left')
frame_for_after.pack(side='left')
button_frame = tk.Frame(root)
button_for_sleep = tk.Button(button_frame, text='Create 3 radiobuttons with sleep+update', command=create_with_sleep)
button_for_after = tk.Button(button_frame, text='Create 3 radiobuttons with after', command=create_with_after)
button_frame.pack()
button_for_sleep.pack(side='left')
button_for_after.pack(side='left')
time_label = tk.Label(root, text='Time delay in seconds:')
time_label.pack(fill='x')
time_entry = tk.Entry(root)
time_entry.insert(0, 1)
time_entry.pack(fill='x')
root.mainloop()
阻止此行为。
但是有一个很好的选择,after
方法,看看吧!
还有一个片段,所以你可以看到差异:
{{1}}
延迟1秒没有太大区别,但您可以尝试增加延迟,以了解after
选项为preferable in general的原因。