簡體   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