Получение значения после создания объекта из пользовательского ввода Tkinter Python

Я не могу понять это, хотя я смотрел видео об объектно-ориентированном программировании и классах в python.

Упрощенный сценарий: 2 занятия. class1 в основном представляет собой окно с двумя кнопками (button1 создает объект 2-го класса, а button2 получает значение изнутри этого вновь созданного виджета Entry объекта через entrybox.get())

class2 — это фрейм с виджетом tkinter Entry.

import tkinter as tk

class WindowClass:

    def create_frame(self):
        new_window = FrameClass(self.master)

    def get_value(self):
        """WHAT CODE DO I PUT HERE TO GET THE VALUE ENTERED BY USER INTO THE ENTRYBOX?"""
        pass

    def __init__(self):
        super().__init__()

        root = tk.Tk()
        self.master = root
        self.master.geometry('500x500')

        self.create_frame_button = tk.Button(self.master,
                                             text='Create Frame with Entry',
                                             width=20,
                                             command=self.create_frame)

        self.get_value_button = tk.Button(self.master,
                                          text='Get value from frame',
                                          width=20,
                                          command=self.get_value)

        self.create_frame_button.place(x=10, y=10)
        self.get_value_button.place(x=10, y=40)

        root.mainloop()


class FrameClass:

    def __init__(self, master):

        self.master = master

        self.frame = tk.Frame(self.master, height=250, width=480, relief='solid', bd=4)
        self.entrybox = tk.Entry(self.frame, width=15, font='Calibri, 12')

        self.entrybox.place(x=10, y=10)
        self.frame.place(x=10, y=100)

if __name__ == '__main__':
    WindowClass()

помогите пожалуйста всем спасибо

Пожалуйста, соблюдайте интервалы между знаками равенства и другими мерами, чтобы сделать ваш код более читабельным, как указано в PEP8 (peps.python.org/pep-0008). Другие могут нахмуриться, если вы этого не сделаете. Она обязательна к прочтению для программистов среднего уровня.

Pycoder 26.10.2022 09:44

Я ценю этот совет, но PyCharm использует этот тип синтаксиса, и мне также легко его читать. Кроме того, PyCharm, вероятно, является одной из моих любимых IDE, кроме вариантов Visual Studio для C.

Alena 27.10.2022 01:27

при этом ссылка, которую вы предоставили, отлично читается, спасибо!

Alena 27.10.2022 01:56
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
3
56
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Решение

Это тема, над которой я тоже боролся. Но, к счастью, я нашел способ сделать это. Во-первых, сделайте так, чтобы FrameClass наследовал WindowClass. Затем в функции __init__FrameClass инициализируйте WindowClass. Теперь, когда вы хотите получить доступ к атрибуту FrameClass в WindowClass, используйте self. Это работает, потому что когда вы инициализируете WindowClass в FrameClass, FrameClass передает свой объект (в приведенном ниже коде это «obj») в WindowClass (self относится к объекту, через который был вызван метод). Далее, если вы хотите получить доступ к атрибуту WindowClass в FrameClass, вы можете использовать либо self, либо super. super ускоряет работу, но может использоваться только для методов и self поиска в MRO (сначала дочерний класс, затем родительский класс), а также может использоваться для атрибутов. Вот ваш код, чтобы упростить понимание:

Код

import tkinter as tk

class WindowClass:
    def get_value(self):
        value = self.entrybox.get()
        print(value)
        "DO WHATEVER YOU WANT TO DO WITH THE VALUE HERE"

    def __init__(self):
        root = tk.Tk()
        self.master = root
        self.master.geometry('500x500')

        self.create_frame_button = tk.Button(self.master,
                                             text='Create Frame with Entry',
                                             width=20,
                                             command=lambda: self.create_frame(self.master))

        self.get_value_button = tk.Button(self.master,
                                          text='Get value from frame',
                                          width=20,
                                          command=self.get_value)

        self.create_frame_button.place(x=10, y=10)
        self.get_value_button.place(x=10, y=40)

        root.mainloop()

class FrameClass(WindowClass):
    def __init__(self):
        super().__init__()

    def create_frame(self, master):
        self.__master = master

        self.frame = tk.Frame(self.__master, height=250, width=480, relief='solid', bd=4)
        self.entrybox = tk.Entry(self.frame, width=15, font='Calibri, 12')

        self.entrybox.place(x=10, y=10)
        self.frame.place(x=10, y=100)

if __name__ == '__main__':
    obj = FrameClass()

Примечание. Обычно рекомендуется создавать графический интерфейс в другой функции, а не в __init__. Я удалил функцию create_frame и заменил ее лямбда-функцией . Я также использовал изменение имени, чтобы избежать путаницы между self.master обоих классов. Я надеюсь, что это помогло вам решить вашу проблему и расширило ваши знания о OO Tkinter! Кроме того, если вы ничего не поняли из информации, приведенной в ответе, вы можете прокомментировать и спросить.

Как интересно, спасибо за быстрый ответ. Знаете ли вы какие-нибудь книги или, может быть, интернет-ресурсы о более продвинутом ООП и наследовании?

Alena 27.10.2022 01:31

Я также понял, что с помощью вложенных классов этого было на 100% легче достичь, но какой отличный урок, тем не менее.

Alena 27.10.2022 03:54

Что ж, вам нужно пройти через многие, поэтому я рекомендую лучшие сайты, такие как geeksforgeeks, programiz и w3schools для дополнительного чтения, но я не знаю ни одной книги (я даже не использую их)

Pycoder 27.10.2022 14:18

Другие вопросы по теме