Интро или о чём разговор
Приветствую вас, уважаемые друзья. Снова сегодня работаем на python. И тема наших с вами изысканий - windows формы. Да-да, наш python не только язык скриптов, он вполне себе неплохо работает с “оконными” интерфейсами, причем в базовой комплектации.
Верная Tk() - друг питонистов
Итак, что нам нужно, чтобы появились окна? Существует много разных библиотек, но большинство из них требует дополнительной установки. В базовой комплектации имеется библиотека Tk(), которая как верный соратник всегда доступна. Давайте откроем Visual Studio Code (или Notepad++, или PyCharm, или IDLE, кому в чём удобнее работать ), создадим файл index.py и напишем вот такой текст:
Запустим эту программу командой index.py и получим вот такую форму:
Что обозначает каждая команда?
from tkinter import *
тут все просто - импорт всех классов из библиотеки tkinter.
gui = Tk()
создали экземпляр класса Tk(), т.е. форму
gui.geometry("600x500+300+200")
размер формы и её положение относительно левого верхнего угла экрана (всё в пикселях) :
600 (первое число) - ширина формы
500 (второе число) - высота формы
300 (третье число) - сдвиг вправо от левого верхнего угла экрана
200 (четвертое число) - сдвиг вниз от левого верхнего угла экрана
Ну и наконец, когда параметры формы заданы, мы запускаем форму командой
gui.mainloop()
Вот так вот вкратце и работает Tk()
Фреймы Tk(): открываешь сумочку, достаешь кошелочку…
Что можно сказать про созданную выше форму? Создалась хорошо, быстро, но не хватает текстовых полей, кнопочек, надписей и всего прочего. Вот этим и займемся. Но прежде давайте определимся, а что наша программа будет делать. Пусть у нас будет маленький текстовый редактор, в котором можно написать пару строчек в текстовом поле и сохранить нашу заметку в txt-файл (именно так работают блокноты в смартфонах, да и редактор Блокнот в windows, mcedit в линкусах и т.д.).
Во-первых объявим всем, что это у нас текстовый редактор. Напишем в нашем коде такую строчку:
запустим, получим
Отлично, название готово (вы здесь можете дать редактору своё название). Теперь содержимое формы. В принципе можно бахать все элементы прямо на форму, но это всё будет не очень корректно выглядеть, и этим не очень удобно управлять со стороны программиста, поэтому лучше элементы размещать в отдельных контейнерах, которые называются фреймы (Frame). У нас основных элементов два: поле редактирования текста (где мы собственно и вводим новый текст) и кнопка сохранения, Для каждого из них создадим свой фрейм, а затем упакуем эти фреймы в основную форму gui методом pack():
frame_text = Frame(gui, bg='green', bd=5)
frame_button = Frame(gui, bg='blue', bd=5)
frame_text.pack()
frame_button.pack()
мы создали два фрейма - frame_text для текстового поля и frame_button для кнопки. Цвета фона bg мы им задали green и blue - зеленый и синий. Цвета эти достаточно “кричащие”, в реальных текстовых файлах их стараются избежать, но нам они нужны для демонстрации, как и что работает в форме Tk. Если мы сейчас запустим нашу программу, то мы ничего нового не увидим:
Форма выглядит так же, как и при нашем “безфреймовом” её создании. Так как же нам увидеть фреймы. Мы должны разместить на них элементы - на frame_text текстовое поле, на frame_button - кнопочку:
В общем виде программа выглядит так
from tkinter import *
Запустим программу
Вот теперь видно, что обозначали параметры фреймов bd=5 обозначает что отступ каждого элемента от границ фрейма 5 px. Это позволяет нам видеть цвета фреймов - текстовый зеленый, кнопочный - синий.
Кнопка смотрится не очень эстетично, лучше, если она будет по всей ширине нашей формы, поэтому сделаем её ширину 600 пикселей при помощи команды:
butt_save.configure(width=600)
также увеличим высоту текстового поля до 25, чтобы вся форма была занята:
text = Text(frame_text, height=25, font='Arial,14',wrap=WORD)
(ну и пишем всё шрифтом Arial кегль 14, как и указано в параметрах текстового поля).
Рукописи не горят, или сохраняем заметку
Сейчас при нажатии кнопки ничего не происходит, но нам надо сохранять нашу информацию в текстовый файл, как мы и планировали. Для этого мы должны задать нашей кнопке параметр command=, задающий выполнение определенной функции, а также написать эту функцию.
Занимаемся кнопкой:
видим команду command=save,, и соответственно пишем функцию save, но делаем это чуть раньше, сразу после создания экземпляра Tk():
То есть мы содержимое поля text сохраняем через функцию get() в переменную mess. Потом открываем файл mess.txt на запись (параметр w), и пока он открыт на запись, записываем в него содержимое переменной mess.
Запускаем программу на выполнение, пишем какой-нибудь текст в текстовом поле и нажимаем кнопку Сохранить. В результате в папке с программой создается файл mess.txt, в который записывается наш текст
Всё отлично сработало, но нам надо уметь задавать файл для сохранения в диалоговом окне. Вы очень удивитесь, но… за диалоговые окна отвечает тот же tkinter. Для этой цели отдельно импортируем библиотеку filedialog и немного модифицируем нашу функцию сохранения файла:
То есть мы открываем диалоговое окно и создаем переменную filepath, в которую мы запишем имя файла из диалогового окна. Если эта переменная будет не пустая, то есть если мы в диалоговом окне не нажмем Отмена, то выполнится наша процедура сохранения текста в файл, только не в mess.txt, а в тот файл, имя и путь к которому мы пропишем в диалоге. Попробуем:
В этом случае текст сохранится в файл mess2.txt, название которого мы прописали в диалоговом окне. Проверяем - файл создался, текст записался.
На этом мы заканчиваем наше исследование работы Tk() и создание простого текстового файла. Благодарю за внимание и жду комментариев
#python #tk #формы #питон