繁体   English   中英

tkinter 如何更新动态创建的 label 上的文本

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

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM