[英]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.