我正在构建一个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)