readme.md 7.6 KB

Привязка


Python


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()

Вот что получилось:



Режимы привязки


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()


Вот что вышло:



Обновление привязки


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()


Вот что получилось:



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()


Вот что вышло:



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()

Вот что вышло:



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()


Вот что вышло: