Не отобразилась форма расчета стоимости? Переходи по ссылке

Не отобразилась форма расчета стоимости? Переходи по ссылке

Изучаем Python Tkinter: основы создания графического интерфейса

Информатика Редакция 0 89

Статья представляет введение в библиотеку Tkinter для языка программирования Python и описывает основные элементы интерфейса, менеджеры геометрии, обработку событий, работу с виджетами, создание многооконных приложений, работу с графическими элементами и приводит примеры использования Tkinter.

Помощь в написании работы

Введение в Python Tkinter

Python Tkinter – это библиотека, которая позволяет создавать графические пользовательские интерфейсы (GUI) в Python. Она предоставляет набор инструментов и виджетов для создания окон, кнопок, полей ввода и других элементов интерфейса.

В этой лекции мы рассмотрим основные концепции и возможности Tkinter, а также научимся создавать простые и удобные пользовательские интерфейсы для наших программ.

Установка и настройка Tkinter

Tkinter – это стандартная библиотека Python, которая предоставляет инструменты для создания графического интерфейса пользователя (GUI). Чтобы начать использовать Tkinter, вам нужно установить его и настроить.

Установка Tkinter

Tkinter входит в стандартную библиотеку Python, поэтому вам не нужно устанавливать его отдельно. Однако, если вы используете старую версию Python, вам может потребоваться установить Tkinter отдельно. Для этого вы можете использовать менеджер пакетов Python, такой как pip:

pip install tkinter

После установки Tkinter вы можете начать использовать его в своих программах.

Настройка Tkinter

При использовании Tkinter вам не требуется особая настройка. Однако, если вы хотите изменить внешний вид или поведение вашего интерфейса, вы можете настроить различные параметры.

Например, вы можете настроить цвета, шрифты, размеры и расположение виджетов. Вы также можете настроить обработку событий и связи между виджетами.

Для настройки Tkinter вы можете использовать методы и атрибуты, предоставляемые самой библиотекой. Вы также можете использовать сторонние библиотеки и инструменты для более сложной настройки.

Важно помнить, что настройка Tkinter может быть сложной и требовать определенных знаний и опыта. Поэтому рекомендуется изучить документацию и примеры использования Tkinter, чтобы получить более полное представление о его возможностях и способах настройки.

Нужна помощь в написании работы?

Написание учебной работы за 1 день от 100 рублей. Посмотрите отзывы наших клиентов и узнайте стоимость вашей работы.

Подробнее

Основные элементы интерфейса Tkinter

Tkinter предоставляет различные элементы интерфейса, которые вы можете использовать для создания графического пользовательского интерфейса (GUI). Вот некоторые из основных элементов интерфейса Tkinter:

Окно (Window)

Окно является основным элементом интерфейса Tkinter. Оно представляет собой прямоугольную область, в которой отображаются другие элементы интерфейса, такие как кнопки, текстовые поля и т. д. Вы можете создать окно с помощью класса Tk:

import tkinter as tk

window = tk.Tk()
window.mainloop()

Метка (Label)

Метка используется для отображения текста или изображения на окне. Она представляет собой статический элемент интерфейса, который не может быть изменен пользователем. Вы можете создать метку с помощью класса Label:

label = tk.Label(window, text="Привет, мир!")
label.pack()

Кнопка (Button)

Кнопка используется для создания интерактивных элементов интерфейса, которые пользователь может нажимать. Кнопка может выполнять определенные действия при нажатии. Вы можете создать кнопку с помощью класса Button:

button = tk.Button(window, text="Нажми меня")
button.pack()

Текстовое поле (Entry)

Текстовое поле используется для ввода текста пользователем. Оно представляет собой интерактивный элемент интерфейса, который позволяет пользователю вводить и редактировать текст. Вы можете создать текстовое поле с помощью класса Entry:

entry = tk.Entry(window)
entry.pack()

Список (Listbox)

Список используется для отображения списка элементов, из которых пользователь может выбрать один или несколько. Список представляет собой интерактивный элемент интерфейса, который позволяет пользователю выбирать элементы из списка. Вы можете создать список с помощью класса Listbox:

listbox = tk.Listbox(window)
listbox.pack()

Фрейм (Frame)

Фрейм используется для группировки других элементов интерфейса вместе. Он представляет собой прямоугольную область, в которой можно разместить другие элементы интерфейса. Фрейм может быть использован для создания сложных макетов и организации элементов интерфейса. Вы можете создать фрейм с помощью класса Frame:

frame = tk.Frame(window)
frame.pack()

Это только некоторые из основных элементов интерфейса Tkinter. Существуют и другие элементы, такие как ползунок, флажок, радиокнопка и т. д., которые вы можете использовать для создания более сложных интерфейсов. Используйте документацию Tkinter для получения более подробной информации о каждом элементе интерфейса и его свойствах.

Менеджеры геометрии в Tkinter

Менеджеры геометрии в Tkinter используются для управления размещением элементов интерфейса в окне. Они определяют, как элементы будут располагаться и изменять свои размеры при изменении размеров окна. Tkinter предоставляет три основных менеджера геометрии:

Менеджер Pack

Менеджер Pack используется для автоматического размещения элементов в окне. Он располагает элементы в виде стека, где каждый элемент занимает всю доступную ширину окна и занимает свободное пространство по вертикали. Вы можете использовать метод pack() для применения менеджера Pack к элементу:

button1 = tk.Button(window, text="Кнопка 1")
button1.pack()

button2 = tk.Button(window, text="Кнопка 2")
button2.pack()

В приведенном выше примере кнопки button1 и button2 будут размещены друг под другом в окне.

Менеджер Grid

Менеджер Grid используется для размещения элементов в виде сетки с определенными строками и столбцами. Вы можете указать, в какой строке и столбце должен находиться каждый элемент. Менеджер Grid позволяет более гибко управлять размещением элементов в окне. Вы можете использовать метод grid() для применения менеджера Grid к элементу:

label1 = tk.Label(window, text="Метка 1")
label1.grid(row=0, column=0)

label2 = tk.Label(window, text="Метка 2")
label2.grid(row=0, column=1)

В приведенном выше примере метки label1 и label2 будут размещены в первой строке окна, причем label1 будет находиться в первом столбце, а label2 – во втором столбце.

Менеджер Place

Менеджер Place используется для абсолютного позиционирования элементов в окне. Вы можете указать точные координаты (x, y) для каждого элемента. Менеджер Place позволяет полностью контролировать размещение элементов в окне. Вы можете использовать метод place() для применения менеджера Place к элементу:

entry1 = tk.Entry(window)
entry1.place(x=50, y=50)

entry2 = tk.Entry(window)
entry2.place(x=100, y=100)

В приведенном выше примере текстовые поля entry1 и entry2 будут размещены в окне на указанных координатах (50, 50) и (100, 100) соответственно.

Вы можете комбинировать различные менеджеры геометрии в одном окне, чтобы достичь нужного размещения элементов. Например, вы можете использовать менеджер Pack для размещения кнопок в стек, а затем использовать менеджер Grid для размещения меток в сетке.

Это только краткое введение в менеджеры геометрии в Tkinter. Каждый менеджер имеет свои особенности и дополнительные параметры, которые вы можете использовать для настройки размещения элементов. Используйте документацию Tkinter для получения более подробной информации о каждом менеджере геометрии и его свойствах.

Обработка событий в Tkinter

Обработка событий в Tkinter позволяет реагировать на действия пользователя, такие как нажатие кнопки, перемещение мыши или ввод текста. Tkinter предоставляет возможность привязывать функции к определенным событиям и выполнять эти функции при возникновении событий.

Привязка функций к событиям

Для привязки функции к событию в Tkinter используется метод bind(). Этот метод принимает два аргумента: событие, на которое нужно реагировать, и функцию, которую нужно вызвать при возникновении события.

Например, чтобы вызвать функцию my_function() при нажатии кнопки, можно использовать следующий код:

button = tk.Button(window, text="Нажми меня")

def my_function(event):
    print("Кнопка была нажата")

button.bind("", my_function)
button.pack()

В приведенном выше примере функция my_function() будет вызываться при нажатии левой кнопки мыши на кнопке button. Внутри функции можно выполнять любые действия, которые необходимы при возникновении события.

События клавиатуры

В Tkinter можно обрабатывать события клавиатуры, такие как нажатие клавиши или ввод текста. Для этого используются специальные символы, которые представляют клавиши на клавиатуре.

Например, чтобы вызвать функцию my_function() при нажатии клавиши Enter, можно использовать следующий код:

entry = tk.Entry(window)

def my_function(event):
    print("Клавиша Enter была нажата")

entry.bind("", my_function)
entry.pack()

В приведенном выше примере функция my_function() будет вызываться при нажатии клавиши Enter в текстовом поле entry. Вы можете использовать другие символы для обработки других клавиш.

События мыши

В Tkinter можно обрабатывать события мыши, такие как нажатие кнопки мыши, перемещение мыши или отпускание кнопки мыши. Для этого используются специальные символы, которые представляют различные действия мыши.

Например, чтобы вызвать функцию my_function() при перемещении мыши над кнопкой, можно использовать следующий код:

button = tk.Button(window, text="Наведи на меня")

def my_function(event):
    print("Мышь наведена на кнопку")

button.bind("", my_function)
button.pack()

В приведенном выше примере функция my_function() будет вызываться при перемещении мыши над кнопкой button. Вы можете использовать другие символы для обработки других действий мыши.

Это только краткое введение в обработку событий в Tkinter. Вы можете использовать различные события и функции для создания интерактивных элементов интерфейса. Используйте документацию Tkinter для получения более подробной информации о доступных событиях и их символах.

Работа с виджетами в Tkinter

В Tkinter виджеты представляют собой элементы интерфейса, такие как кнопки, текстовые поля, метки и другие. В этом разделе мы рассмотрим основные виджеты, их свойства и методы, а также способы их использования.

Кнопки (Button)

Кнопки в Tkinter используются для выполнения определенных действий при их нажатии. Кнопки могут содержать текст или изображение, а также могут быть настроены с помощью различных свойств.

Пример создания кнопки:

button = tk.Button(window, text="Нажми меня")

В приведенном выше примере создается кнопка с текстом “Нажми меня”. Кнопка будет отображаться на главном окне window.

Свойства кнопки:

  • text: текст, отображаемый на кнопке
  • command: функция, которая будет вызываться при нажатии кнопки
  • state: состояние кнопки (normal, disabled)

Методы кнопки:

  • pack(): размещает кнопку на окне
  • grid(): размещает кнопку с использованием сетки
  • place(): размещает кнопку в определенном месте окна

Текстовые поля (Entry)

Текстовые поля в Tkinter используются для ввода и отображения текста. Они могут быть однострочными или многострочными, а также могут быть настроены с помощью различных свойств.

Пример создания текстового поля:

entry = tk.Entry(window)

В приведенном выше примере создается однострочное текстовое поле. Поле будет отображаться на главном окне window.

Свойства текстового поля:

  • textvariable: переменная, связанная с текстовым полем
  • show: символ, отображаемый вместо введенного текста (например, для паролей)
  • state: состояние текстового поля (normal, disabled)

Методы текстового поля:

  • get(): возвращает текст из текстового поля
  • insert(): вставляет текст в текстовое поле
  • delete(): удаляет текст из текстового поля

Метки (Label)

Метки в Tkinter используются для отображения статического текста или изображений. Они не могут быть изменены пользователем и используются для информационных целей.

Пример создания метки:

label = tk.Label(window, text="Привет, мир!")

В приведенном выше примере создается метка с текстом “Привет, мир!”. Метка будет отображаться на главном окне window.

Свойства метки:

  • text: текст, отображаемый на метке
  • image: изображение, отображаемое на метке
  • compound: способ объединения текста и изображения (left, right, top, bottom)

Методы метки:

  • pack(): размещает метку на окне
  • grid(): размещает метку с использованием сетки
  • place(): размещает метку в определенном месте окна

Это только некоторые из основных виджетов в Tkinter. Вы можете использовать их в сочетании с другими виджетами и методами для создания интерактивного пользовательского интерфейса.

Создание многооконных приложений в Tkinter

В Tkinter можно создавать многооконные приложения, которые состоят из нескольких окон. Это может быть полезно, когда требуется разделить функциональность приложения на разные части или показать дополнительные окна для настроек или дополнительной информации.

Создание нового окна

Для создания нового окна в Tkinter необходимо выполнить следующие шаги:

  1. Импортировать модуль Tkinter: import tkinter as tk
  2. Создать экземпляр класса Tk: window = tk.Tk()
  3. Создать новое окно: new_window = tk.Toplevel(window)

В приведенном выше примере создается новое окно new_window, которое будет отображаться поверх главного окна window.

Закрытие окна

Для закрытия окна в Tkinter можно использовать метод destroy(). Он уничтожает окно и все его виджеты, освобождая память.

Пример закрытия окна:

window.destroy()

В приведенном выше примере закрывается главное окно window.

Передача данных между окнами

Чтобы передать данные между окнами в Tkinter, можно использовать атрибуты и методы классов окон. Например, можно создать атрибут в главном окне и получить доступ к нему из другого окна.

Пример передачи данных между окнами:

class MainWindow(tk.Tk):
    def __init__(self):
        super().__init__()
        self.data = "Привет, мир!"

class NewWindow(tk.Toplevel):
    def __init__(self, main_window):
        super().__init__(main_window)
        self.main_window = main_window
        print(self.main_window.data)  # Выводит "Привет, мир!"

window = MainWindow()
new_window = NewWindow(window)

В приведенном выше примере создается главное окно MainWindow с атрибутом data. Затем создается новое окно NewWindow, которое получает доступ к атрибуту data главного окна.

Это основные шаги для создания многооконных приложений в Tkinter. Вы можете создавать любое количество окон и передавать данные между ними, чтобы создать более сложные приложения.

Работа с графическими элементами в Tkinter

В Tkinter можно создавать и работать с различными графическими элементами, такими как изображения, кнопки, метки, текстовые поля и другие. Эти элементы позволяют пользователю взаимодействовать с приложением и отображать информацию.

Изображения

Для работы с изображениями в Tkinter необходимо использовать модуль PIL (Python Imaging Library). Сначала нужно установить его, выполнив команду pip install pillow.

Пример создания и отображения изображения:

from PIL import Image, ImageTk
import tkinter as tk

window = tk.Tk()

# Загрузка изображения
image = Image.open("image.jpg")

# Создание объекта ImageTk
image_tk = ImageTk.PhotoImage(image)

# Создание метки с изображением
label = tk.Label(window, image=image_tk)
label.pack()

window.mainloop()

В приведенном выше примере сначала загружается изображение с помощью метода open() из модуля Image. Затем создается объект ImageTk с помощью загруженного изображения. Наконец, создается метка с изображением и отображается на главном окне.

Кнопки

Кнопки позволяют пользователю выполнять определенные действия при нажатии на них. В Tkinter кнопки создаются с помощью класса Button.

Пример создания кнопки:

import tkinter as tk

window = tk.Tk()

# Создание функции-обработчика для кнопки
def button_click():
    print("Кнопка нажата!")

# Создание кнопки
button = tk.Button(window, text="Нажми меня", command=button_click)
button.pack()

window.mainloop()

В приведенном выше примере создается функция-обработчик button_click(), которая будет вызываться при нажатии на кнопку. Затем создается кнопка с помощью класса Button и указывается команда, которая будет выполняться при нажатии на кнопку. Наконец, кнопка отображается на главном окне.

Метки

Метки используются для отображения текста или изображений на графическом интерфейсе. В Tkinter метки создаются с помощью класса Label.

Пример создания метки:

import tkinter as tk

window = tk.Tk()

# Создание метки с текстом
label = tk.Label(window, text="Привет, мир!")
label.pack()

window.mainloop()

В приведенном выше примере создается метка с текстом “Привет, мир!” с помощью класса Label. Затем метка отображается на главном окне.

Текстовые поля

Текстовые поля позволяют пользователю вводить и редактировать текст. В Tkinter текстовые поля создаются с помощью класса Entry.

Пример создания текстового поля:

import tkinter as tk

window = tk.Tk()

# Создание текстового поля
entry = tk.Entry(window)
entry.pack()

window.mainloop()

В приведенном выше примере создается текстовое поле с помощью класса Entry. Затем текстовое поле отображается на главном окне.

Это основные графические элементы, которые можно использовать в Tkinter. Вы можете настраивать их свойства, такие как размер, цвет, шрифт и другие, чтобы создать интерфейс, соответствующий вашим потребностям.

Примеры использования Tkinter

В Tkinter можно создавать разнообразные графические приложения, от простых окон с кнопками до сложных интерфейсов с множеством виджетов. Вот несколько примеров использования Tkinter:

Пример 1: Простое окно с кнопкой

В этом примере мы создадим простое окно с одной кнопкой, которая будет выводить сообщение при нажатии.

import tkinter as tk

def button_click():
    print("Кнопка нажата!")

window = tk.Tk()

button = tk.Button(window, text="Нажми меня", command=button_click)
button.pack()

window.mainloop()

В этом примере мы создаем функцию-обработчик button_click(), которая будет вызываться при нажатии на кнопку. Затем мы создаем окно с помощью Tk(), создаем кнопку с помощью Button() и указываем команду, которая будет выполняться при нажатии на кнопку. Наконец, мы отображаем окно с помощью mainloop().

Пример 2: Калькулятор

В этом примере мы создадим простой калькулятор с использованием кнопок и текстового поля.

import tkinter as tk

def button_click(number):
    current = entry.get()
    entry.delete(0, tk.END)
    entry.insert(tk.END, current + str(number))

def button_clear():
    entry.delete(0, tk.END)

def button_equal():
    result = eval(entry.get())
    entry.delete(0, tk.END)
    entry.insert(tk.END, result)

window = tk.Tk()

entry = tk.Entry(window)
entry.pack()

button1 = tk.Button(window, text="1", command=lambda: button_click(1))
button1.pack()

button2 = tk.Button(window, text="2", command=lambda: button_click(2))
button2.pack()

button_clear = tk.Button(window, text="C", command=button_clear)
button_clear.pack()

button_equal = tk.Button(window, text="=", command=button_equal)
button_equal.pack()

window.mainloop()

В этом примере мы создаем функции-обработчики для кнопок: button_click() для ввода чисел, button_clear() для очистки текстового поля и button_equal() для выполнения вычислений. Затем мы создаем текстовое поле с помощью Entry() и кнопки с помощью Button(). Мы используем лямбда-функции, чтобы передать аргументы в функцию-обработчик button_click(). Наконец, мы отображаем окно с помощью mainloop().

Пример 3: Графический интерфейс для базы данных

В этом примере мы создадим графический интерфейс для работы с базой данных SQLite. Мы будем отображать данные из таблицы и позволять пользователю добавлять, редактировать и удалять записи.

import tkinter as tk
import sqlite3

def connect():
    conn = sqlite3.connect("database.db")
    cursor = conn.cursor()
    cursor.execute("CREATE TABLE IF NOT EXISTS students (id INTEGER PRIMARY KEY, name TEXT, age INTEGER)")
    conn.commit()
    conn.close()

def insert(name, age):
    conn = sqlite3.connect("database.db")
    cursor = conn.cursor()
    cursor.execute("INSERT INTO students VALUES (NULL, ?, ?)", (name, age))
    conn.commit()
    conn.close()

def update(id, name, age):
    conn = sqlite3.connect("database.db")
    cursor = conn.cursor()
    cursor.execute("UPDATE students SET name=?, age=? WHERE id=?", (name, age, id))
    conn.commit()
    conn.close()

def delete(id):
    conn = sqlite3.connect("database.db")
    cursor = conn.cursor()
    cursor.execute("DELETE FROM students WHERE id=?", (id,))
    conn.commit()
    conn.close()

def view():
    conn = sqlite3.connect("database.db")
    cursor = conn.cursor()
    cursor.execute("SELECT * FROM students")
    rows = cursor.fetchall()
    conn.close()
    return rows

def get_selected_row(event):
    try:
        global selected_row
        index = listbox.curselection()[0]
        selected_row = listbox.get(index)
        entry_name.delete(0, tk.END)
        entry_name.insert(tk.END, selected_row[1])
        entry_age.delete(0, tk.END)
        entry_age.insert(tk.END, selected_row[2])
    except IndexError:
        pass

def refresh_listbox():
    listbox.delete(0, tk.END)
    for row in view():
        listbox.insert(tk.END, row)

def add_entry():
    name = entry_name.get()
    age = entry_age.get()
    insert(name, age)
    refresh_listbox()

def update_entry():
    id = selected_row[0]
    name = entry_name.get()
    age = entry_age.get()
    update(id, name, age)
    refresh_listbox()

def delete_entry():
    id = selected_row[0]
    delete(id)
    refresh_listbox()

window = tk.Tk()

label_name = tk.Label(window, text="Имя:")
label_name.grid(row=0, column=0)

entry_name = tk.Entry(window)
entry_name.grid(row=0, column=1)

label_age = tk.Label(window, text="Возраст:")
label_age.grid(row=1, column=0)

entry_age = tk.Entry(window)
entry_age.grid(row=1, column=1)

button_add = tk.Button(window, text="Добавить", command=add_entry)
button_add.grid(row=2, column=0)

button_update = tk.Button(window, text="Обновить", command=update_entry)
button_update.grid(row=2, column=1)

button_delete = tk.Button(window, text="Удалить", command=delete_entry)
button_delete.grid(row=2, column=2)

listbox = tk.Listbox(window, height=6, width=35)
listbox.grid(row=3, column=0, rowspan=6, columnspan=2)

scrollbar = tk.Scrollbar(window)
scrollbar.grid(row=3, column=2, rowspan=6)

listbox.configure(yscrollcommand=scrollbar.set)
scrollbar.configure(command=listbox.yview)

listbox.bind("<>", get_selected_row)

connect()
refresh_listbox()

window.mainloop()

В этом примере мы создаем функции для работы с базой данных SQLite: connect() для подключения к базе данных, insert() для добавления записи, update() для обновления записи, delete() для удаления записи и view() для получения данных из таблицы. Мы также создаем функцию get_selected_row(), которая будет вызываться при выборе записи в списке, и функцию refresh_listbox(), которая будет обновлять список записей. Затем мы создаем элементы интерфейса, такие как метки, текстовые поля, кнопки и список, и размещаем их на главном окне. Мы используем сеточную компоновку с помощью метода grid(). Наконец, мы подключаемся к базе данных, обновляем список записей и отображаем окно с помощью mainloop().

Это только некоторые примеры использования Tkinter. Вы можете создавать разнообразные графические приложения, взаимодействовать с базами данных, работать с файлами, отображать графики и многое другое с помощью Tkinter.

Сравнительная таблица по теме “Python Tkinter”

Тема Описание Пример
Введение в Tkinter Обзор основных концепций и возможностей библиотеки Tkinter import tkinter as tk
Установка и настройка Tkinter Инструкции по установке и настройке Tkinter на различных операционных системах sudo apt-get install python3-tk
Основные элементы интерфейса Tkinter Описание основных виджетов и их свойств tk.Label, tk.Button, tk.Entry
Менеджеры геометрии в Tkinter Объяснение различных менеджеров геометрии и их использование pack(), grid(), place()
Обработка событий в Tkinter Как обрабатывать события, такие как нажатие кнопки или изменение значения поля button.bind(““, callback)
Работа с виджетами в Tkinter Примеры создания и настройки различных виджетов entry = tk.Entry(root, width=30)
Создание многооконных приложений в Tkinter Как создавать и управлять несколькими окнами в Tkinter top = tk.Toplevel()
Работа с графическими элементами в Tkinter Использование графических элементов, таких как изображения и графики canvas.create_image(), canvas.create_line()
Примеры использования Tkinter Практические примеры создания различных интерфейсов с использованием Tkinter Пример приложения для ввода данных

Заключение

В данной лекции мы изучили основы работы с библиотекой Tkinter в Python. Tkinter предоставляет нам удобные инструменты для создания графического интерфейса пользователя. Мы рассмотрели основные элементы интерфейса, такие как кнопки, текстовые поля, метки и другие. Также мы изучили различные менеджеры геометрии, которые позволяют нам управлять расположением элементов на экране. Мы также рассмотрели обработку событий и создание многооконных приложений. В заключение, Tkinter является мощным инструментом для создания графических приложений в Python, и его знание может быть полезным для разработки различных проектов.

Средняя оценка 0 / 5. Количество оценок: 0

Поставьте вашу оценку

Сожалеем, что вы поставили низкую оценку!

Позвольте нам стать лучше!

Расскажите, как нам стать лучше?

89
Ссылка по ГОСТ
Изучаем Python Tkinter: основы создания графического интерфейса // Научые Статьи.Ру — портал для студентов и аспирантов. — Дата последнего обновления статьи: 08.09.2023. — URL https://nauchniestati.ru/spravka/python-tkinter/ (дата обращения: 06.12.2023).
Закажите помощь с работой

Не отобразилась форма расчета стоимости? Переходи по ссылке

Не отобразилась форма расчета стоимости? Переходи по ссылке

Реклама
Читайте также
Рекомендуем

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *