Мы можем создать собственный виджет, который будет включать в себя функцию отображения нескольких значков состояния для одного конкретного устройства.Давайте назовем его MultiStateIcon
и выведем из tk.Frame
.
. Этот виджет будет содержать коллекцию дочерних tk.Label
виджетов, по одному на каждое возможное состояние / изображение.Все метки будут перекрываться, однако будет видна только одна (соответствующая текущему состоянию) (остальные можно скрыть с помощью pack_forget()
).
Тогда вам просто нужно создать сетку из MultiStateIcon
s (или любой другой макет по вашему желанию) и просто измените их состояние, как показывает текстовый файл.
Для демонстрации я сделал приложение периодически (каждые 10 мс), устанавливающее состояние одного случайно выбранногоустройство в произвольно выбранном состоянии.
Пример сценария:
import Tkinter as tk
import PIL.Image, PIL.ImageTk
from random import randrange
class MultiStateIcon(tk.Frame):
def __init__(self, parent, images, *args, **kwargs):
tk.Frame.__init__(self, parent, *args, **kwargs)
self.images = images
self.labels = []
for image in images:
l = tk.Label(self, image = image)
l.pack()
self.labels.append(l)
self.set_state(0)
def set_state(self, n):
for i in range(len(self.labels)):
if i == n:
self.labels[i].pack()
else:
self.labels[i].pack_forget()
class TestApp(tk.Tk):
def __init__(self, image_paths, *args, **kwargs):
tk.Tk.__init__(self, *args, **kwargs)
self.title("Test")
self.frame = tk.Frame(self)
self.frame.pack()
self.images = []
for image_path in image_paths:
img = PIL.ImageTk.PhotoImage(PIL.Image.open(image_path))
self.images.append(img)
self.icons = []
for r in range(10):
for c in range(15):
icon_lbl = MultiStateIcon(self.frame, self.images)
icon_lbl.grid(row=r, column=c)
self.icons.append(icon_lbl)
self.after(1000, self.change_random_icon)
def change_random_icon(self):
n = randrange(0, len(self.icons))
state = randrange(0, len(self.images))
self.icons[n].set_state(state)
self.after(10, self.change_random_icon)
def run():
app = TestApp(["multiicon_0.png", "multiicon_1.png", "multiicon_2.png"])
app.mainloop()
run()
Изображения, которые я использовал:

Снимки экрана приложения (один в начале, другой через некоторое время - использование памяти кажется стабильным):

