Два класса, имеющие ссылки друг на друга - PullRequest
0 голосов
/ 19 января 2019

Я работаю на асинхронном TCP-сервере.

Все идет хорошо, и я многому у меня учусь, но у меня есть вопрос, связанный со структурой.

Вот как выглядит структура:

Global overview

Объект Server - это асинхронный TCP-сервер, работающий в своем собственном потоке. Он связывается с объектом GUI Controller через поточно-ориентированные очереди.

В главном потоке у нас есть контроллер графического интерфейса пользователя, mainloop tkinter и реальный класс графического интерфейса Tkinter.

вот код, чтобы сделать его более понятным:

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 взаимодействовать с графическим контроллером. Идея дать ссылку на класс друг друга не работает:

Если я дам MainWindow ссылку на Controller , мне нужно сохранить его в переменной в конструкторе MainWindow . Затем мне нужно обновлять эту переменную каждый цикл, который очень требователен.

Как я могу дать ссылку правильным способом, или есть лучший способ дать этим двум классам общаться?

Большое спасибо!

1 Ответ

0 голосов
/ 20 января 2019

Я исправил это при перемещении класса графического интерфейса Tkinter и класса контроллера в их собственный файл .py вместо того, чтобы оба они находились в одном файле.

Я обнаружил, что забыл некоторые self., поэтому контроллер будет пытаться получить доступ к объекту GUI, определенному в глобальной области видимости, вместо ссылки, которую я дал. После размещения этих self. все работает как я ожидал!

Так что для других людей: Если вы хотите, чтобы два объекта ссылались друг на друга :

  1. Установить заполнитель для другого объекта в каждом конструкторе. (спасибо @Dashadower)
  2. Дайте каждому классу метод переназначения этого заполнителя с фактической ссылкой (Дайте объект в качестве аргумента)

  3. Не забудьте вызвать ссылку на объект другого объекта . (ИСПОЛЬЗОВАНИЕ self.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...