动态添加,隐藏或忘记Tkinter帧基于字典记录值



我正在构建一个GUI应用程序来监视/控制远程嵌入式客户端设备。每个客户机的状态机都保存在一个主字典中,并在GUI中表示为Notebook小部件中的选项卡(Frame)实例。我想实例化一个选项卡(在我的应用程序中定义为一个类)每当一个新的客户端注册和隐藏或忘记选项卡时,客户端链接超时。如果/当客户端重新注册时,我将重新实例化。

我是Python, Tkinter和OO的新手,并且正在与程序结构作斗争。我需要不断地循环遍历字典记录以刷新GUI,但我得出的结论是,我不能在root.mainloop()结构中进行迭代。因此,状态机字典记录或元素中的"外部"更改需要在外部刷新相应的GUI Notebook选项卡实例,包括创建和删除我的选项卡类的实例。

我相信有一个标准的做法,但我还没有在我的学习中取得足够的进步来弄清楚这一点。如果您能给我指点一下方向,我将不胜感激。

我需要解决三个元素来让我的解决方案工作:

1)使用根。函数后启用外部异步事件(例如。非kinter GUI事件)使用更新方法控制GUI元素…谢谢你,Terry Jan Reedy!

2)在GUI实例化本身中作为一种方法执行整体字典更新,而不是试图使用单独的函数来处理我的字典管理。也许这对大多数人来说是显而易见的,但这对我来说是一个范式的转变。

3) GUI需要是我的类的所有字典元素的单个实例化,而不是每个元素的单独实例化。

下面的代码片段。

def remote_window_mgr():
    remote_window = client_gui()

class client_gui(object):
    def __init__(self):
        self.root = Tk()
        self.root.title('Client Manager')
        # Create main Frame in Window
        main_frame = ttk.Frame(self.root, borderwidth = 5, relief = 'ridge')
        main_frame.grid(column = 0, row = 0, sticky = (N, W, E, S))
        main_frame.columnconfigure(0, weight = 1)
        main_frame.rowconfigure(0, weight = 1)
        # Create Notebook widget to host Client Tabs
        self.tab_frame = ttk.Notebook(main_frame)
        self.tab_frame.grid(column = 1, row = 1)
        self.root.after(1000, func=self.gui_update)
        self.root.mainloop()

    def gui_update(self):
        for client_id in list(Client_Records.keys()):
            # Check for new Client
            if client_id not in list(Client_Tabs.keys()):
                client_data = Client_Records[client_id]
                # Create Client Tab
                self.add_tab(client_id)
        for client_id in list(Client_Tabs.keys()):
            # Check if Client Record has been purged...
            if client_id not in list(Client_Records.keys()):
                # Client Record no longer exists, delete Client Tab
                self.remove_tab(client_id)
                del Client_Tabs[client_id]
        for client_id in list(Client_Tabs.keys()):
            # Refresh client tabs for all active clients
            self.update_tab(client_id)
        self.root.after(1000, func=self.gui_update)

相关内容

  • 没有找到相关文章

最新更新