Загрузка данных


import tkinter as tk
from tkinter import messagebox, font

# Основной класс приложения
class Lab12App:
    def __init__(self, root):
        self.root = root
        self.root.title("Пример1")  # заголовок окна
        self.root.geometry("800x600+100+50")  # размер и положение окна на экране
        self.root.configure(bg='lightgray')  # начальный цвет фона

        # Переменные для хранения текущего состояния
        self.current_color = 'lightgray'  # текущий цвет фона
        self.color_name = "серый"  # название текущего цвета
        self.click_count = 0  # счётчик нажатий на кнопку
        self.colors = [  # список доступных цветов (код, название)
            ('red', 'красный'),
            ('orange', 'оранжевый'),
            ('yellow', 'жёлтый'),
            ('green', 'зелёный'),
            ('blue', 'синий'),
            ('purple', 'фиолетовый')
        ]
        self.color_index = 0  # индекс текущего цвета для циклического переключения

        # ============================================================
        # ЧАСТЬ 1: ОСНОВНЫЕ ЭЛЕМЕНТЫ ВЕРХНЕЙ ЧАСТИ ОКНА
        # ============================================================

        # 1. МЕТКА для отображения названия цвета
        self.color_label = tk.Label(root, text="", bg='white', font=('Arial', 12))
        self.color_label.pack(pady=5)

        # 2. ПОЛЕ для отображения количества нажатий (только для чтения)
        self.count_entry = tk.Entry(root, width=10, state='readonly')
        self.count_entry.pack(pady=5)
        self.update_count_display()

        # 3. КНОПКА циклического изменения цвета
        self.btn_color = tk.Button(root, text="Цвет формы", command=self.cycle_color)
        self.btn_color.pack(pady=5)

        # ============================================================
        # ЧАСТЬ 2: ГЛАВНОЕ МЕНЮ
        # ============================================================
        
        menubar = tk.Menu(root)
        root.config(menu=menubar)

        # Подменю "Файл"
        file_menu = tk.Menu(menubar, tearoff=0)
        menubar.add_cascade(label="Файл", menu=file_menu)
        file_menu.add_command(label="Выход", command=self.quit_app)

        # Подменю "Цвет формы"
        color_menu = tk.Menu(menubar, tearoff=0)
        menubar.add_cascade(label="Цвет формы", menu=color_menu)
        for color, name in self.colors:
            color_menu.add_command(
                label=name.capitalize(),
                command=lambda c=color, n=name: self.set_color(c, n)
            )

        # ============================================================
        # ЧАСТЬ 3: ФРЕЙМ ВЫБОРА ЦВЕТА
        # ============================================================
        
        frame_choice = tk.LabelFrame(root, text="Выбор цвета", padx=5, pady=5)
        frame_choice.pack(pady=10, fill='x')

        # Checkbutton
        self.check_var = tk.IntVar()
        self.check_btn = tk.Checkbutton(
            frame_choice, 
            text="Красный цвет",
            variable=self.check_var, 
            command=self.apply_check_color
        )
        self.check_btn.pack(side='left', padx=10)

        # Radiobutton
        self.radio_var = tk.StringVar(value='lightgray')
        for color, name in self.colors:
            rb = tk.Radiobutton(
                frame_choice, 
                text=name.capitalize(), 
                variable=self.radio_var,
                value=color, 
                command=self.apply_radio_color
            )
            rb.pack(side='left', padx=2)

        # Listbox
        self.listbox = tk.Listbox(frame_choice, height=4)
        for color, name in self.colors:
            self.listbox.insert(tk.END, name.capitalize())
        self.listbox.pack(side='left', padx=10)
        self.listbox.bind('<<ListboxSelect>>', self.apply_listbox_color)

        # ============================================================
        # ЧАСТЬ 4: ФРЕЙМ НАСТРОЕК
        # ============================================================
        
        frame_settings = tk.LabelFrame(root, text="Настройки", padx=5, pady=5)
        frame_settings.pack(pady=10, fill='x')

        # Строка 0: изменение заголовка окна
        tk.Label(frame_settings, text="Заголовок окна:").grid(row=0, column=0, sticky='w')
        self.title_entry = tk.Entry(frame_settings)
        self.title_entry.insert(0, "Пример1")
        self.title_entry.grid(row=0, column=1, padx=5)
        tk.Button(
            frame_settings, 
            text="Изменить заголовок", 
            command=self.change_title
        ).grid(row=0, column=2)

        # Строка 1: изменение размера окна
        tk.Label(frame_settings, text="Ширина:").grid(row=1, column=0, sticky='w')
        self.width_entry = tk.Entry(frame_settings, width=6)
        self.width_entry.insert(0, "800")
        self.width_entry.grid(row=1, column=1, sticky='w')
        
        tk.Label(frame_settings, text="Высота:").grid(row=1, column=2, sticky='w')
        self.height_entry = tk.Entry(frame_settings, width=6)
        self.height_entry.insert(0, "600")
        self.height_entry.grid(row=1, column=3, sticky='w')
        
        tk.Button(
            frame_settings, 
            text="Изменить размер", 
            command=self.resize_window
        ).grid(row=1, column=4, padx=5)

        # Строка 2: изменение размера кнопки
        tk.Label(frame_settings, text="Ширина кнопки:").grid(row=2, column=0, sticky='w')
        self.btn_width_entry = tk.Entry(frame_settings, width=6)
        self.btn_width_entry.insert(0, "10")
        self.btn_width_entry.grid(row=2, column=1, sticky='w')
        
        tk.Label(frame_settings, text="Высота кнопки:").grid(row=2, column=2, sticky='w')
        self.btn_height_entry = tk.Entry(frame_settings, width=6)
        self.btn_height_entry.insert(0, "1")
        self.btn_height_entry.grid(row=2, column=3, sticky='w')
        
        tk.Button(
            frame_settings, 
            text="Применить размер", 
            command=self.change_button_size
        ).grid(row=2, column=4, padx=5)

        # Строка 3: изменение шрифта
        tk.Label(frame_settings, text="Шрифт метки:").grid(row=3, column=0, sticky='w')
        self.font_family = tk.StringVar(value="Arial")
        self.font_size = tk.IntVar(value=12)
        
        tk.Entry(frame_settings, textvariable=self.font_family, width=10).grid(row=3, column=1)
        tk.Spinbox(frame_settings, from_=8, to=30, textvariable=self.font_size, width=5).grid(row=3, column=2)
        tk.Button(
            frame_settings, 
            text="Применить шрифт", 
            command=self.change_label_font
        ).grid(row=3, column=3, padx=5)

        # ============================================================
        # ЧАСТЬ 5: ФРЕЙМ ДЛЯ ОБЪЕДИНЕНИЯ СТРОК (ЗДЕСЬ ДОБАВЛЕНА НОВАЯ КНОПКА)
        # ============================================================
        
        frame_concat = tk.LabelFrame(root, text="Объединение строк", padx=5, pady=5)
        frame_concat.pack(pady=10, fill='x')

        # Первое поле ввода
        self.entry1 = tk.Entry(frame_concat, width=20)
        self.entry1.pack(side='left', padx=5)
        
        # Второе поле ввода
        self.entry2 = tk.Entry(frame_concat, width=20)
        self.entry2.pack(side='left', padx=5)
        
        # Кнопка "Соединить"
        tk.Button(frame_concat, text="Соединить", command=self.concat_text).pack(side='left', padx=5)
        
        # НОВАЯ КНОПКА "Поменять местами"
        tk.Button(frame_concat, text="Поменять местами", command=self.swap_text).pack(side='left', padx=5)
        
        # Метка для вывода результата
        self.concat_result = tk.Label(frame_concat, text="", bg='white', width=30)
        self.concat_result.pack(side='left', padx=5)

        # ============================================================
        # ЧАСТЬ 6: ФРЕЙМ ДЛЯ СЛОЖЕНИЯ ЧИСЕЛ
        # ============================================================
        
        frame_sum = tk.LabelFrame(root, text="Сложение целых чисел", padx=5, pady=5)
        frame_sum.pack(pady=10, fill='x')

        self.num1_entry = tk.Entry(frame_sum, width=10)
        self.num1_entry.pack(side='left', padx=5)
        
        self.num2_entry = tk.Entry(frame_sum, width=10)
        self.num2_entry.pack(side='left', padx=5)
        
        tk.Button(frame_sum, text="Суммировать", command=self.sum_numbers).pack(side='left', padx=5)
        
        self.sum_result = tk.Label(frame_sum, text="", bg='white', width=10)
        self.sum_result.pack(side='left', padx=5)

    # ============================================================
    # МЕТОДЫ-ОБРАБОТЧИКИ
    # ============================================================

    def update_count_display(self):
        """Обновляет отображение счётчика нажатий"""
        self.count_entry.config(state='normal')
        self.count_entry.delete(0, tk.END)
        self.count_entry.insert(0, str(self.click_count))
        self.count_entry.config(state='readonly')

    def set_color(self, color, name):
        """Устанавливает цвет фона окна и обновляет метку с названием"""
        self.root.configure(bg=color)
        self.color_label.config(text=name.capitalize())
        self.current_color = color
        self.color_name = name

    def cycle_color(self):
        """Циклическое переключение цветов при нажатии на кнопку"""
        self.click_count += 1
        self.update_count_display()
        color, name = self.colors[self.color_index % len(self.colors)]
        self.set_color(color, name)
        self.color_index += 1

    def quit_app(self):
        """Выход из программы с подтверждением"""
        if messagebox.askokcancel("Выход", "Вы действительно хотите выйти?"):
            self.root.quit()

    def apply_check_color(self):
        """Обработка Checkbutton"""
        if self.check_var.get():
            self.set_color('red', 'красный')
        else:
            self.set_color('lightgray', 'серый')

    def apply_radio_color(self):
        """Обработка Radiobutton"""
        color = self.radio_var.get()
        for c, name in self.colors:
            if c == color:
                self.set_color(color, name)
                break

    def apply_listbox_color(self, event):
        """Обработка выбора элемента в списке Listbox"""
        selection = self.listbox.curselection()
        if selection:
            index = selection[0]
            color, name = self.colors[index]
            self.set_color(color, name)

    def change_title(self):
        """Изменение заголовка окна"""
        new_title = self.title_entry.get()
        self.root.title(new_title)

    def resize_window(self):
        """Изменение размера окна"""
        try:
            w = int(self.width_entry.get())
            h = int(self.height_entry.get())
            self.root.geometry(f"{w}x{h}")
        except ValueError:
            messagebox.showerror("Ошибка", "Введите целые числа для ширины и высоты.")

    def change_button_size(self):
        """Изменение размера кнопки 'Цвет формы'"""
        try:
            width = int(self.btn_width_entry.get())
            height = int(self.btn_height_entry.get())
            self.btn_color.config(width=width, height=height)
        except ValueError:
            messagebox.showerror("Ошибка", "Введите целые числа для размера кнопки.")

    def change_label_font(self):
        """Изменение шрифта метки с названием цвета"""
        family = self.font_family.get()
        size = self.font_size.get()
        try:
            self.color_label.config(font=(family, size))
        except Exception as e:
            messagebox.showerror("Ошибка", f"Не удалось установить шрифт: {e}")

    def concat_text(self):
        """Объединение текста из двух полей ввода"""
        text1 = self.entry1.get()
        text2 = self.entry2.get()
        self.concat_result.config(text=text1 + text2)

    def swap_text(self):
        """НОВЫЙ МЕТОД: меняет местами текст в двух полях ввода"""
        # Получаем текст из обоих полей
        text1 = self.entry1.get()
        text2 = self.entry2.get()
        
        # Очищаем поля
        self.entry1.delete(0, tk.END)
        self.entry2.delete(0, tk.END)
        
        # Вставляем swapped текст
        self.entry1.insert(0, text2)
        self.entry2.insert(0, text1)
        
        # Выводим результат в метку
        self.concat_result.config(text=f"Поменяли: '{text1}' ↔ '{text2}'")

    def sum_numbers(self):
        """Сложение двух целых чисел"""
        try:
            num1 = int(self.num1_entry.get())
            num2 = int(self.num2_entry.get())
            result = num1 + num2
            self.sum_result.config(text=str(result))
        except ValueError:
            messagebox.showerror("Ошибка", "Введите целые числа в оба поля.")

# Запуск приложения
if __name__ == "__main__":
    root = tk.Tk()
    app = Lab12App(root)
    root.mainloop()