Как определить контроллер Tkinter? - PullRequest
0 голосов
/ 09 марта 2020

Код фона: при попытке всплывающего окна вызвать функцию из другого класса.

У меня проблемы с определением контроллера и правильной настройкой моих функций. Я получаю сообщение об ошибке, что контроллер не был определен до его передачи в класс popupWindow , что имеет смысл, поскольку Я не определил контроллер где-то еще, но я не знаю, где это сделать :

NameError: name 'controller' is not defined

Я изучил эти прошлые ответы для получения помощи, но все еще застрял:

Вызов контроллера кадров Tkinter из функции, а не по команде кнопки

Вызов функций из фрейма Tkinter в другой

Вот мой упрощенный код (Примечание: я определяю различные переменные в функции values ​​ в других функциях класса BoundingBox , но я не включил эти функции для ясности и сокращения кода):

Я также не понимаю, как заставить работать функцию get_page что является частью моей проблемы с выяснением, как и где определить контроллер.

import tkinter as tk
from tkinter import *

class BoundingBox(tk.Tk):
    def __init__(self):
        tk.Tk.__init__(self)

    def get_page(self, page_class):
        return self.frames[page_class]

    def popup(self):
        self.w=popupWindow(self.master,controller)

    def values(self):     
        print(self.start_x, self.start_y, self.end_x, self.end_y, self.totwidth, self.totheight, self.value1, self.value2)
        self.allcord.append([self.start_x, self.start_y, self.end_x, self.end_y, self.totwidth, self.totheight, self.value1, self.value2])
        self.allrect.append(self.rect)
        print (len(self.allcord))     

class popupWindow(tk.Toplevel):
    def __init__(self, master, controller):
        super().__init__(master)
        self.controller = controller
        self.l1=Label(self,text="Breed")
        self.l1.grid(row=0, column=0)
        self.e1=Entry(self)
        self.e1.grid(row=0, column=1)
        self.l2=Label(self,text="Color")
        self.l2.grid(row=1, column=0)
        self.e2=Entry(self)
        self.e2.grid(row=1, column=1)
        self.b=Button(self,text='Save',command=self.cleanup)
        self.b.grid(row=2, column=1)

    def cleanup(self):
        self.value1=self.e1.get()
        self.value2=self.e2.get()
        self.controller.values()
        self.top.destroy()

if __name__ == "__main__":
    draw = BoundingBox()
    draw.mainloop()


1 Ответ

0 голосов
/ 09 марта 2020

В этом конкретном случае c, controller просто ссылается на главное окно. Итак, вам просто нужно передать self в качестве аргумента controller:

def popup(self):
    self.w=popupWindow(self.master, self)

Обратите внимание, как метод cleanup вызывает self.controller.values(). values определено в BoundingBox, поэтому ясно, что popupwindow был разработан, чтобы иметь BoundingBox в качестве контроллера.

...