Обработка и хранение данных / подсказка к 1 задачке

1

Сделать задачку используя концепцию классов. Добавить Label на форму. Сделать так чтобы при клике на кнопку Привет в этот Label приветствовался пользователь. А также добавить вторую кнопку на форму, при клике на которую в Label будет выводится прощание с пользователем.

Как-то так:

Чтобы установить текст метки используйте свойство text, вот так:

self.label['text'] = "Привет, друг"

Сегодня попробуем более грамотно работать с интерфейсами путем организации кода в так называемые классы.

И так, возьмем нашу базовую заготовку для запуска интерфейса, выглядит она вот так:

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

Такой подход позволяют проще структурировать сложный код.