两类相互引用

时间:2019-01-19 14:00:56

标签: python tkinter server reference structure

我正在使用异步TCP服务器。

一切进展顺利,我从中学到了很多,但是我有一个与结构有关的问题。

这是结构的外观:

Global overview

Server对象是在自己的线程中运行的异步TCP服务器。 它通过线程安全队列与GUI控制器对象进行通信。

在主线程上,我们有GUI控制器,tkinter主循环和实际的Tkinter GUI类。

下面是一些代码,以使其更清楚:

clientlist = []
#queue's for communicating with server thread
buffer = queue.Queue()
buffer2 = queue.Queue()

root = Tk()
#GUI controller
controller = Controller(buffer,buffer2,clientlist,root)
#Make Tkinter GUI and give a reference to the controller
top = MainWindow(controller, root)
#Giving Tkinter GUI reference to the controller
controller.set_top(top)

t1 = threading.Thread(target=run_server, args=(buffer,buffer2))
t1.start()

controller.check_connections()


root.protocol("WM_DELETE_WINDOW", on_closing)
try:
    while controller.run:
        root.mainloop()
    print("[i] Joining server thread.")
    t1.join()

我很难找到使Tkinter GUI与GUI控制器通信的好方法。我在这里要互相参考的想法是行不通的:

如果我给 MainWindow 提供对 Controller 的引用,则需要将其保存到 MainWindow 的构造函数中的变量中。然后,我需要在每个循环中更新该变量,这是非常苛刻的。

我该如何给参考提供正确的方法,还是有更好的方法让这两个类进行交流?

非常感谢!

1 个答案:

答案 0 :(得分:0)

我将Tkinter GUI类和控制器类都移到了自己的.py文件中,而不是将它们都放在同一个文件中时,解决了这个问题。

我发现我忘记了一些self.,因此控制器将尝试访问在全局范围内定义的GUI对象,而不是我给出的引用。放置完这些self.后,一切都按预期工作了!

对于其他人: 如果要给两个对象互相引用

  1. 在每个构造函数中为另一个对象设置一个占位符。 (感谢@Dashadower)
  2. 给每个类一个方法,以使用实际引用重新分配该占位符                              (将对象作为参数)

  3. 不要忘记调用另一个 object objects引用。 (使用self.