[英]tkinter how to update text on a dynamically created label
我正在動態創建給定數量的標簽(示例中為 3 個)現在我想單獨更新其中的文本,但我如何檢測哪個是正確更新的?
是否可以在服務器 class 中添加某種監聽器,它將向 GUI 報告狀態的任何變化,這樣我就不必在每次操作后檢查?
這是我准備的一個例子:-
import tkinter as tk
import time
class App(tk.Tk):
def __init__(self):
super().__init__()
servers = ["Server One", "Server Two", "Server Three"]
for i, server in enumerate(servers):
server_instance = Server(server)
label_server_name = tk.Label(self, text=server)
label_server_name.grid(row=i + 1, column=0)
self.label_server_status = tk.Label(self, text="Not Running")
self.label_server_status.grid(row=i + 1, column=1)
button_start_server = tk.Button(
self,
text="Start",
command=lambda inst=server_instance: self._start_server(inst),
)
button_start_server.grid(row=i + 1, column=2)
button_stop_server = tk.Button(
self,
text="Stop",
command=lambda inst=server_instance: self._stop_server(inst),
)
button_stop_server.grid(row=i + 1, column=3)
def _start_server(self, server):
server.start_server()
# how do I select the correct server text?
self.label_server_status["text"] = "Starting..."
# Simulate server starting
time.sleep(1)
self._update_status(server)
def _stop_server(self, server):
server.stop_server()
# how do I select the correct server text?
self.label_server_status["text"] = "Stopping..."
# Simulate server starting
time.sleep(1)
self._update_status(server)
def _update_status(self, server):
if server.is_running:
print(f"{server.name} is running")
# Change relevant label_server_status to Running
else:
print(f"{server.name} is not running")
# Change relevant label_server_status to Not Running
class Server:
def __init__(self, name):
self.name = name
self.is_running = False
def start_server(self):
# simulte starting the server
self.is_running = True
return True
def stop_server(self):
self.is_running = False
if __name__ == "__main__":
app = App()
app.mainloop()
感謝@TheLizzard 在上面的評論,正如他正確地說的那樣,解決方案是將標簽放入字典中,這是我完成的工作示例:
import tkinter as tk
class App(tk.Tk):
def __init__(self):
super().__init__()
servers = ["Server One", "Server Two", "Server Three"]
self.labels = {}
for i, server in enumerate(servers):
server_instance = Server(server)
label_server_name = tk.Label(self, text=server)
label_server_name.grid(row=i + 1, column=0)
label_server_status = tk.Label(self, text="Not Running")
label_server_status.grid(row=i + 1, column=1)
self.labels[server] = label_server_status
button_start_server = tk.Button(
self,
text="Start",
command=lambda inst=server_instance: self._start_server(inst),
)
button_start_server.grid(row=i + 1, column=2)
button_stop_server = tk.Button(
self,
text="Stop",
command=lambda inst=server_instance: self._stop_server(inst),
)
button_stop_server.grid(row=i + 1, column=3)
def _start_server(self, server):
server.start_server()
self._update_status(server)
def _stop_server(self, server):
server.stop_server()
self._update_status(server)
def _update_status(self, server):
if server.is_running:
print(f"{server.name} is running")
self.labels[server.name]["text"] = "running"
else:
print(f"{server.name} is not running")
self.labels[server.name]["text"] = "not running"
class Server:
def __init__(self, name):
self.name = name
self.is_running = False
def start_server(self):
# simulte starting the server
self.is_running = True
return True
def stop_server(self):
self.is_running = False
if __name__ == "__main__":
app = App()
app.mainloop()
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.