Отображение метки из другого объекта - PullRequest
0 голосов
/ 21 января 2020

Так вот мой код:

import tkinter as tk

class Window(tk.Tk):
    def __init__(self, *args, **kwargs):
        tk.Tk.__init__(self, *args, **kwargs)
        self.container = tk.Frame(self)
        self.container.pack(side="top", fill="both", expand = True)
        self.label1 = tk.Label(self.container, text="label")
        self.label1.pack()
        self.fwd_button = tk.Button(self, text="Continue", command=lambda: books_display(subframe.Main_Title))
        self.fwd_button.pack()

    def print_label(self):
        print (self.label1['text'])

class subframe_newscripts():
    def __init__(self, parent):
        self = tk.Frame(parent)
        self.pack()
        self.Main_Title = tk.Label(self, text="New Scripts")
        self.Main_Title.grid(row=0, column=0)
        self.Book_display_frame = tk.Frame(self)
        self.Book_display_frame.grid(row=1, column=0)


def books_display(widget):
        print (widget['text'])

app = Window()
subframe = subframe_newscripts(app)

app.mainloop()

Я пытаюсь напечатать ярлык "Main_title" с помощью кнопки. Когда я запускаю программу, я получаю эту ошибку:

AttributeError: у объекта 'subframe_newscripts' нет атрибута 'Main_Title'

Не уверен, что я делаю неправильно ...

1 Ответ

1 голос
/ 21 января 2020

Ваша проблема связана с этой строкой:

self = tk.Frame(parent)

self используется для ссылки на класс, и именно так мы можем получить доступ к методам и атрибутам класса из других методов и вне класса , Однако вы на самом деле переопределяете, что значит быть фреймом, а у фреймов нет атрибута класса Main_Title.

. Чтобы исправить это, вы также хотите определить фрейм как атрибут класса. Нечто подобное будет работать нормально:

self.frame = tk.Frame(parent)

Все, что говорит, я бы изменил несколько вещей.

  1. Я бы написал 2-й класс для наследования от фрейма. Я считаю, что это немного чище и проще в обслуживании.

  2. Вы должны попытаться следовать стандартному соглашению об именах. Ваше имя не соответствует. Вам нужно некоторое время, чтобы прочитать PEP8 , чтобы ваш код было легче читать.

  3. Я предпочитаю использовать super().__init__() вместо tk.Tk.__init__(), так как он работает для большинство ситуаций, а также текущий стандарт для Python 3.

  4. Он предпочитает применять диспетчер геометрии вне класса, когда ваш класс является контейнером, подобным фрейму. Таким образом, если вам нужно использовать этот же фрейм в другом месте, вы можете использовать любой менеджер геометрии, не сталкиваясь с конфликтами, если вы используете grid() или pack() в различных областях вашего кода.

Исправлен и очищен код для более точного соответствия стандартам PEP8:

import tkinter as tk


class Window(tk.Tk):
    def __init__(self):
        super().__init__()
        container = tk.Frame(self)
        container.pack(side="top", fill="both", expand = True)
        self.label1 = tk.Label(container, text="label")
        self.label1.pack()
        tk.Button(self, text="Continue", command=lambda: books_display(sub_frame.main_title)).pack()

    def print_label(self):
        print(self.label1['text'])


class SubFrameNewScripts(tk.Frame):
    def __init__(self, master):
        super().__init__(master)
        self.main_title = tk.Label(self, text="New Scripts")
        self.main_title.grid(row=0, column=0)
        self.book_display_frame = tk.Frame(self)
        self.book_display_frame.grid(row=1, column=0)


def books_display(widget):
    print(widget['text'])


if __name__ == '__main__':
    app = Window()
    sub_frame = SubFrameNewScripts(app)
    sub_frame.pack()
    app.mainloop()

Результаты:

enter image description here

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