如何使用Tkinter逐个创建GUI对象

时间:2017-06-12 19:28:37

标签: python-3.x time tkinter

我喜欢每秒创建一个对象并逐个显示。但是,下面的代码等待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()

2 个答案:

答案 0 :(得分:0)

您可以使用update来调用对象的刷新。

在使用中,您必须在root.update()循环中添加第for行。

答案 1 :(得分:0)

您的代码按原样每秒创建一个对象,但需要显示此对象,并在代码流到达mainloop时显示。因此,对于观察者来说,看起来一秒钟后根本没有任何物体。

当然,您可以使用sleepupdate,但要注意 - sleep会导致窗口无响应,所以可以选择(说实话 - 根本不行),如果你的应用程序没有被绘制而且你在mainloop之外,但是如果它不是 - 准备一个“冻结”窗口,因为GUI只能在mainloop重绘自己(一个事件循环,你也可以通过updatesleep联系,并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的原因。