Сегодня попробуем более грамотно работать с интерфейсами путем организации кода в так называемые классы.
И так, возьмем нашу базовую заготовку для запуска интерфейса, выглядит она вот так:
from tkinter import *
def my_setup(gui):
gui.geometry("600x200")
gui = Tk()
my_setup(gui)
gui.mainloop()
перепишем ее следующим образом
from tkinter import *
class UI():
def __init__(self, gui):
gui.geometry("600x200")
gui = Tk()
UI(gui)
gui.mainloop()
UI – это так называемый класс, классы позволяют нам более удобно работать с функциями. Например, добавим поле для ввода и кнопочку которая при клике будет приветствовать пользователя по имени которое он ввел:
from tkinter import *
class UI():
def __init__(self, gui):
gui.geometry("600x200")
text = Entry(gui)
text.place(x=10, y=10, width=300, height=20)
def button_click():
print(f"Привет {text.get()}")
button = Button(gui, text="Привет", command=button_click)
button.place(x=320, y=10)
gui = Tk()
UI(gui)
gui.mainloop()
возможно вас, как и меня раздражало то, что мы не можем взять функцию button_click и поместить, например, после создания элементов.
Так вот использование классов позволяет это сделать. Для этого код надо переписать следующим образом:
from tkinter import *
class UI():
def __init__(self, gui):
gui.geometry("600x200")
self.text = Entry(gui)
self.text.place(x=10, y=10, width=300, height=20)
self.button = Button(gui, text="Привет", command=self.button_click)
self.button.place(x=320, y=10)
def button_click(self):
print(f"Привет {self.text.get()}")
gui = Tk()
UI(gui)
gui.mainloop()
схема работы примерно такая

то есть появляется специальное слово self, это так называемая ссылка на область в памяти на самого себя. И мы привязываем к этому слову self (ну типа к самом себе), поле для ввода text.
Далее выносим реакцию на клик button_click
из функции __init__
и добавляем в качестве парамерта это самое слово self.
Так как этот self и в __init__
и в button_click
это один и тот же объект, то мы можем из функции button_click
получить доступ к полю для ввода, которое было создано в __init__
, обращаясь к нему через self.text
И по аналогии из __init__
мы можем получить доступ к функции button_click
обращаясь к нему через self.button_click
Такой подход позволяют проще структурировать сложный код.