Tkinter:同时配置多个小部件

2024-04-20 00:16:43 发布

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

我想一次在一行中设置多个小部件的背景。然而,在这个例子中,您可以看到,有时着色是丑陋的:小部件在不同的时间改变颜色。如何同时更新多个小部件的外观(配置)?虚拟事件能解决这个问题吗?在

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()

提前谢谢!在

编辑:更简化的示例代码。在


Tags: inselfforstyle部件tkinterdefrange
1条回答
网友
1楼 · 发布于 2024-04-20 00:16:43

更新小部件的方式是一次修改多个小部件的正确方法。只要在修改所有小部件的循环中没有对updateupdate_idletask的任何调用,这些修改都应该在下次屏幕刷新时同时出现(即:当函数将控制权返回到事件循环时)。在

当我运行你的代码时,我没有看到闪烁。一切都如我所料。在

相关问题 更多 >