AttributeError: тип объекта «класс» не имеет атрибута «метод» - PullRequest
0 голосов
/ 22 февраля 2019

Продолжайте получать ошибку, AttributeError: type object 'SampleApp' has no attribute 'draw'.Я посмотрел на другие ресурсы по этому вопросу и не видел ни одного, где метод пытался вызвать из другого класса.Я также пробовал def draw() внутри и снаружи _init_.Цель этого состоит в том, что в классе B будет ввод для пользователя, и когда нажата кнопка, виджеты будут рисоваться во фрейме в Sample App, но пока я не могу этого сделать.

import tkinter as tk

class SampleApp(tk.Tk):


    def show_frame(self, page_name):
        frame = self.frames[page_name]
        frame.tkraise()

    def __init__(self, *args, **kwargs):
        tk.Tk.__init__(self, *args, **kwargs)


        self.left_frame = tk.Frame(self, width=426, height=600)
        self.left_frame.grid(column=0, row=3, columnspan=3, rowspan=10)

        self.right_frame = tk.Frame(self, width=855, borderwidth=2, 
        relief="solid")
        self.right_frame.grid(column=4, row=0, rowspan=9, sticky="nsew")


        self.frames = {}
        for F in (A, B):
            page_name = F.__name__
            frame = F(parent=self.left_frame, controller=self)
            frame.configure(width=426, height=511, borderwidth=2, 
            relief="solid")
            self.frames[page_name] = frame
            frame.grid(row=0, column=0, columnspan=3, 
            rowspan=2,sticky="nsew")

        self.show_frame("A")


        def draw():
            print("We")
            label = tk.Label(self.left_frame_bottom, text="Hello")
            label.pack()


class A(tk.Frame):

    def __init__(self, parent, controller):
        tk.Frame.__init__(self, parent)
        self.controller = controller
        button = tk.Button(self, text="Go to the start page",
                       command=lambda: controller.show_frame("B"))
        button.pack()

 class B(tk.Frame):

     def __init__(self, parent, controller):
         tk.Frame.__init__(self, parent)
         self.controller = controller


         submit_button = tk.Button(self, text="Submit", 
         command=lambda:SampleApp.draw())
         submit_button.place(x=180, y=320)


if __name__ == "__main__":
    app = SampleApp()
    app.mainloop()

Ответы [ 2 ]

0 голосов
/ 22 февраля 2019

Во-первых, вам нужно исправить отступ draw - отступ на один уровень слишком велик.def draw должен иметь отступ, равный def show_frame.

Во-вторых, поскольку draw - это метод на контроллере, его необходимо вызвать через экземпляр контроллера:

self.controller.draw()
0 голосов
/ 22 февраля 2019

Превышение вашей функции draw(), чтобы она была на том же уровне, что и __init__().Убедитесь, что вы передали self def draw(self):, и если вам нужно, чтобы он запускался при создании экземпляра, просто вызовите self.draw() в вашем __init__() определении.

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