Я не могу понять это, хотя я смотрел видео об объектно-ориентированном программировании и классах в 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()
помогите пожалуйста всем спасибо
Я ценю этот совет, но PyCharm использует этот тип синтаксиса, и мне также легко его читать. Кроме того, PyCharm, вероятно, является одной из моих любимых IDE, кроме вариантов Visual Studio для C.
при этом ссылка, которую вы предоставили, отлично читается, спасибо!
Это тема, над которой я тоже боролся. Но, к счастью, я нашел способ сделать это. Во-первых, сделайте так, чтобы 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! Кроме того, если вы ничего не поняли из информации, приведенной в ответе, вы можете прокомментировать и спросить.
Как интересно, спасибо за быстрый ответ. Знаете ли вы какие-нибудь книги или, может быть, интернет-ресурсы о более продвинутом ООП и наследовании?
Я также понял, что с помощью вложенных классов этого было на 100% легче достичь, но какой отличный урок, тем не менее.
Что ж, вам нужно пройти через многие, поэтому я рекомендую лучшие сайты, такие как geeksforgeeks, programiz и w3schools для дополнительного чтения, но я не знаю ни одной книги (я даже не использую их)
Пожалуйста, соблюдайте интервалы между знаками равенства и другими мерами, чтобы сделать ваш код более читабельным, как указано в PEP8 (peps.python.org/pep-0008). Другие могут нахмуриться, если вы этого не сделаете. Она обязательна к прочтению для программистов среднего уровня.