**[Привязка](https://github.com/kolei/OAP/blob/master/articles/t8_binding.md#привязка-binding-интерфейс-inotifypropertychanged-форматирование-значений-привязки-и-конвертеры-значений)** *** **Python** *** ```angular2html import tkinter as tk #импортирую библиотеку и даю другое название class MainWindow(tk.Tk): #создаю главное окно приложения def __init__(self): super().__init__() self.title("Иванов Валера И-21") self.geometry("300x250") self.text_box = tk.Entry(self) #создаю текстовое поле self.text_box.pack() #размещаю текстовое поле self.text_block = tk.Label(self, textvariable=tk.StringVar(value=self.text_box.get()), height=30) self.text_block.pack() # Привязываю значение текстового поля к переменной textvariable self.text_box.configure(textvariable=self.text_block.cget("textvariable")) if __name__ == "__main__": window = MainWindow() window.mainloop() ``` *** **Вот что получилось:** *** ![](./img/scr.png) *** **Режимы привязки** *** ``` import tkinter as tk class MainWindow(tk.Tk): def __init__(self): super().__init__() self.title("Иванов Валера И-21") self.geometry("400x300") self.text_box1 = tk.Entry(self) self.text_box1.pack() self.text_box2 = tk.Entry(self) self.text_box2.pack() # Привязка значения первого текстового поля ко второму текстовому полю self.text_box2.configure(textvariable=tk.StringVar(value=self.text_box1.get())) self.text_box1.configure(textvariable=self.text_box2.cget("textvariable")) if __name__ == "__main__": window = MainWindow() window.mainloop() ``` *** **Вот что вышло:** *** ![](./img/scr2.png) *** **Обновление привязки** *** ``` import tkinter as tk class MainWindow(tk.Tk): def __init__(self): super().__init__() self.title("Иванов Валера И-21") self.geometry("400x300") self.text_box1 = tk.Entry(self) self.text_box1.pack() self.text_box2 = tk.Entry(self) self.text_box2.pack() # Привязка значения первого текстового поля ко второму текстовому полю self.text_box2.configure(textvariable=tk.StringVar(value=self.text_box1.get())) self.text_box1.configure(textvariable=self.text_box2.cget("textvariable")) # Обновление источника при изменении свойства self.text_box1.configure(validate="key", validatecommand=lambda *args: self.text_box2.configure(textvariable=tk.StringVar(value=self.text_box1.get()))) if __name__ == "__main__": window = MainWindow() window.mainloop() ``` *** **Вот что получилось:** *** ![](./img/scr3.png) *** **Source** *** ``` import tkinter as tk class Phone: def __init__(self, title, company, price): self.title = title self.company = company self.price = price class Company: def __init__(self, company, price): self.company = company self.price = price class MainWindow(tk.Tk): def __init__(self): super().__init__() self.title("Иванов Валера И-21") self.geometry("400x300") # Создание экземпляра класса Phone, Company и добавление его в ресурсы окна iphone = Phone("iPhone 15", "Apple", 72000) self.resources = {"iPhone": iphone} apple = Company("Apple", 100000) self.resources = {"Apple": apple} # Создание сетки и размещение виджетов на ней grid = tk.Frame(self) grid.pack(fill=tk.BOTH, expand=True) grid.columnconfigure(1, weight=1) grid.rowconfigure(0, weight=1) grid.rowconfigure(1, weight=1) tk.Label(grid, text="Model:", foreground="white").grid(row=0, column=0, sticky=tk.W) title_text_block = tk.Label(grid, foreground="white") title_text_block.grid(row=0, column=1, sticky=tk.W+tk.E) title_text_block.configure(textvariable=tk.StringVar(value=iphone.title)) tk.Label(grid, text="Price:", foreground="white").grid(row=1, column=0, sticky=tk.W) price_text_block = tk.Label(grid, foreground="white") price_text_block.grid(row=1, column=1, sticky=tk.W+tk.E) price_text_block.configure(textvariable=tk.StringVar(value=iphone.price)) tk.Label(grid, text="Company:", foreground="white").grid(row=2, column=0, sticky=tk.W) price_text_block = tk.Label(grid, foreground="white") price_text_block.grid(row=2, column=1, sticky=tk.W+tk.E) price_text_block.configure(textvariable=tk.StringVar(value=apple.company)) if __name__ == "__main__": window = MainWindow() window.mainloop() ``` *** **Вот что вышло:** *** ![](./img/scr4.png) *** **RelativeSource** *** ``` import tkinter as tk class MainWindow(tk.Tk): def __init__(self): super().__init__() self.title("Иванов Валера И-21") self.geometry("400x300") # Создание сетки и текстового поля grid = tk.Frame(self, background="black") grid.pack(fill=tk.BOTH, expand=True) text_box = tk.Entry(grid) text_box.pack() # Привязка фона текстового поля к фону сетки text_box.configure(textvariable=tk.StringVar(value=grid["background"])) # Обновление источника при изменении фона текстового поля text_box.configure(validate="key", validatecommand=lambda *args: text_box.configure(background=text_box.get())) if __name__ == "__main__": window = MainWindow() window.mainloop() ``` *** **Вот что вышло:** *** ![](./img/scr6.png) *** **DataTime** *** ``` import tkinter as tk from datetime import datetime class DateTimeToDateConverter: def convert(self, value): return value.date() class MainWindow(tk.Tk): def __init__(self): super().__init__() self.title("Иванов Валера И-21") self.geometry("400x300") # Создание экземпляра DateTime и добавление его в ресурсы окна my_date = datetime(2024, 4, 22) self.resources = {"myDate": my_date} # Создание конвертера DateTimeToDateConverter и добавление его в ресурсы окна my_date_converter = DateTimeToDateConverter() self.resources["myDateConverter"] = my_date_converter # Создание сетки и размещение виджетов на ней grid = tk.Frame(self) grid.pack(fill=tk.BOTH, expand=True) # Создание меток и привязка их текста к источнику данных с использованием конвертера tk.Label(grid, textvariable=tk.StringVar(value=my_date)).grid(row=0, column=0, sticky=tk.W) tk.Label(grid, textvariable=tk.StringVar(value=my_date_converter.convert(my_date))).grid(row=1, column=0, sticky=tk.W) if __name__ == "__main__": window = MainWindow() window.mainloop() ``` *** **Вот что вышло:** *** ![](./img/scr7.png)