Загрузка данных
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()