我想一次在一行中设置多个小部件的背景。然而,在这个例子中,您可以看到,有时着色是丑陋的:小部件在不同的时间改变颜色。如何同时更新多个小部件的外观(配置)?虚拟事件能解决这个问题吗?在
import tkinter
class Application(tkinter.Tk):
TITLE = 'Simultaneous Widget Blink Test'
BLINK_INT = 75
def __init__(self, rows=4, cols=10):
super().__init__()
self.rows, self.cols = rows, cols
self.frames = [[] for _ in range(rows)]
self.labels = [[] for _ in range(rows)]
self.withdraw() # assembling in background...
self.resizable(width=False, height=False)
self.title(self.TITLE)
self.build()
for ri in range(self.rows):
self.curr_ri = ri
self.set_row_style()
self.curr_ri, self.curr_n = 0, 0
self.deiconify() # showing it
self.blink_again()
def build(self):
for ri in range(self.rows):
for ci in range(self.cols):
f = tkinter.Frame(self, width=40, height=40)
self.frames[ri].append(f)
f.grid(row=ri, column=ci, sticky='news')
l = tkinter.Label(f, text='{}{}'.format(ri, ci))
self.labels[ri].append(l)
l.place(relx=0.5, rely=0.5, anchor='c')
def blink_again(self):
if self.curr_n == 10:
self.curr_n = 0
self.curr_ri += 1
if self.curr_ri == self.rows:
self.curr_ri = 0
self.curr_n += 1
self.highlight_row()
def highlight_row(self):
self.set_row_style(bg='orange')
self.after(self.BLINK_INT, self.restore_row)
def restore_row(self):
self.set_row_style()
self.after(self.BLINK_INT, self.blink_again)
def set_row_style(self, bg='white'):
for w in self.frames[self.curr_ri]:
w.configure(bg=bg)
for w in self.labels[self.curr_ri]:
w.configure(bg=bg)
if __name__ == '__main__':
app = Application()
app.mainloop()
提前谢谢!在
编辑:更简化的示例代码。在
更新小部件的方式是一次修改多个小部件的正确方法。只要在修改所有小部件的循环中没有对
update
或update_idletask
的任何调用,这些修改都应该在下次屏幕刷新时同时出现(即:当函数将控制权返回到事件循环时)。在当我运行你的代码时,我没有看到闪烁。一切都如我所料。在
相关问题 更多 >
编程相关推荐