Статья Пишем графическую оболочку на Python - часть 1

explorer

explorer

Red Team
05.08.2018
753
1 619
Приветствую любителей языка Python!

Все вы прекрасно знаете, что программы пишутся как в консольном варианте, так и с графической оболочкой GUI.
GUI - graphical user interface

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

Есть почитатели как и консольных вариантов, так и GUI. И вопрос что лучше совершенно неверный. Самые сложные программы всегда стараются сделать с оболочкой, иначе софт обрастает диким количеством опций, в которых трудно разобраться. Кроме этого, если программа пишется не для личного пользования, то нужно учитывать, что большая часть юзеров сидит под ОС Windows, и привыкла к графике. Поэтому даже если вы ярый приверженец консоли, но например, делаете программы на заказ, то уметь писать программы с оболочкой просто необходимо.

Есть много вариантов Python GUI. Вот неполный список:

Tkinter
PyGTK
PySide

PyQt
wxPython


Мы будем делать интерфейс с помощью Tkinter. Главным преимуществом его является встроенность в Python. То есть не понадобится устанавливать каких-то сторонних модулей, библиотек и прочего ПО. Из минусов можно отметить менее презентабельный внешний вид по сравнению с другими фреймворками и обёртками.

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

Python:
from tkinter import *

root = Tk()
root.title("Моя первая графическая программа на Python")
root.geometry("400x250")
root.resizable(width=False, height=False)

root.mainloop()
Запускаем, и получим такое окошко

gui.png


Теперь пройдёмся по коду и разберёмся что там написано.

from tkinter import * - импортируем tkinter, а значок звёздочки обозначает что нам будут предоставлены все возможности библиотеки. Можно писать по-другому, импортируя исключительно то, что будет использоваться в программе, например так: from tkinter import Tk, Label Но это не очень удобно перечислять через запятую необходимые виджеты.

root = Tk() - вместо root вы можете писать всё что угодно, а Tk() это библиотека модуля tkinter , который является неким обработчиком инструкций для языка Tcl.

root.title("Моя первая графическая программа на Python") - уже из названия ясно что title является заголовком, в который вы можете записать название программы, версию.

root.geometry("400x250") - размеры окна программы. По умолчанию программа запускается в произвольном месте монитора, но стремится к верхнему левому углу экрана. Мы может сами устанавливать место где должна отображаться программа. Для этого добавим в эту конструкцию к ширине и высоте координаты X и координаты Y". При запуске окно будет находиться на 300 пикселей вправо и на 250 пикселей вниз от верхнего левого угла экрана root.geometry("400x250+300+250")

root.resizable(width=False, height=False) - в большинстве случаев нам не нужно чтобы программа меняла размеры окна, и параметрами False мы запрещаем изменения размеров ширины и высоты.

root.mainloop() - метод mainloop запускает весь цикл обработки событий, без него графическая оболочка не запустится.

Ну что же, с запуском главного окна разобрались. Теперь настало время продвигаться дальше. В графическом интерфейсе существуют такие виджеты и элементы как Button, Label, Entry, Radiobutton, Checkbutton и другие. Но всё это добро нужно как-то позиционировать в главном окне программы. Для этого существуют методы pack(), place() и grid().

Самый простой и популярный метод pack(), применяется для самых простеньких программ. Метод place() почти не используется, а метод grid() самый сложный и самый точный. У него больше всего возможностей, и он позволяет расположить элементы именно так как вы это задумали.

Начнём конечно с самого простого - метод pack() :)

Добавим к нашей программе кнопку


Python:
from tkinter import *

root = Tk()
root.title("Моя первая графическая программа на Python")
root.geometry("400x250+300+250")
root.resizable(width=False, height=False)

btn1 = Button(text="BUTTON", background="#000000", foreground="#fff", padx="15", pady="2", font="12")
btn1.pack()

root.mainloop()
И вот кнопка у нас появилась

gui2.png


btn1 = Button(text="BUTTON", background="#000000", foreground="#fff", padx="15", pady="2", font="12") Здесь мы создали Button с названием btn1, написали на кнопке текст BUTTON, и задали цвета для текста и фона кнопки. Также установлены отступы от текста по осям x и y, и размер шрифта. У шрифта можно не только менять размер, но и сам стиль шрифта. Поставьте например font="Arial 10" и сравните результаты.

В данном случае ширина кнопки была равна содержимому + отступы. Но кнопке также можно задать ширину и высоту. Попробуйте добавить значения в код width=12,height=4
btn1.pack() - здесь произошла упаковка нашей кнопки, и она стала видимой
Если мы не указали явным образом где должна располагаться кнопка, то она по умолчанию принимает следующий параметр btn1.pack(side=TOP) Их всего может быть у side 4 - BOTTOM, TOP, LEFT, RIGHT

Виджет Label или текстовая метка. Добавим её в наш код

Python:
label = Label(text="Привет Codeby!", font="12", pady="10")
label.pack()
btn1 = Button(text="BUTTON", background="#000000", foreground="#fff", padx="15", pady="2", font="12")
btn1.pack()
Обратите внимание - метка добавлена выше кнопки, поэтому она и она и отображается выше. Стоит их поменять местами, и в окошке они тоже поменяются местами, попробуйте.

gui3.png


Текстовая метка как и кнопка может принимать значения в длинном и коротком вариантах bg = background
  • bg/background: фоновый цвет
  • fg/foreground: цвет текста
Для первого знакомства думаю достаточно, и теперь домашнее задание:

Сделать оболочку как на скриншоте

gui4.png


В помощь
 
explorer

explorer

Red Team
05.08.2018
753
1 619
Для тех у кого вдруг не получилась картинка из задания, хотя там очень просто, пишу решение. И совсем скоро 2 часть ;)

Python:
from tkinter import *

root = Tk()
root.title("На все 4 стороны")
root.geometry("400x250+300+250")
root.resizable(width=False, height=False)


btn1 = Button(text="СЕВЕР", background="#0000FF", foreground="#fff", pady="2", font="12", width=12)
btn1.pack(side=TOP)
btn2 = Button(text="ЮГ", background="#FF4500", foreground="#fff", pady="2", font="12", width=12)
btn2.pack(side=BOTTOM)
btn3 = Button(text="ЗАПАД", background="#000000", foreground="#fff", pady="2", font="12", width=12)
btn3.pack(side=LEFT)
btn4 = Button(text="ВОСТОК", background="#008000", foreground="#fff", pady="2", font="12", width=12)
btn4.pack(side=RIGHT)
label = Label(text="Куда идти?", font="12", pady="80")
label.pack()

root.mainloop()
 
  • Нравится
Реакции: Jkx
K

krypt0n

Well-known member
12.11.2017
138
66
Для тех у кого вдруг не получилась картинка из задания, хотя там очень просто, пишу решение. И совсем скоро 2 часть ;)

Python:
from tkinter import *

root = Tk()
root.title("На все 4 стороны")
root.geometry("400x250+300+250")
root.resizable(width=False, height=False)


btn1 = Button(text="СЕВЕР", background="#0000FF", foreground="#fff", pady="2", font="12", width=12)
btn1.pack(side=TOP)
btn2 = Button(text="ЮГ", background="#FF4500", foreground="#fff", pady="2", font="12", width=12)
btn2.pack(side=BOTTOM)
btn3 = Button(text="ЗАПАД", background="#000000", foreground="#fff", pady="2", font="12", width=12)
btn3.pack(side=LEFT)
btn4 = Button(text="ВОСТОК", background="#008000", foreground="#fff", pady="2", font="12", width=12)
btn4.pack(side=RIGHT)
label = Label(text="Куда идти?", font="12", pady="80")
label.pack()

root.mainloop()
ну мне по душе pyqt пришелся ))
 
  • Нравится
Реакции: Cenzor
explorer

explorer

Red Team
05.08.2018
753
1 619
Pyqt это замечательно, если юзать без дезигнера. Сначала нужно разобраться как всё работает, а потом уже можно и конструктором пользоваться - очень время экономит.

P.S. А округлые кнопки и в Tkinter одной строчкой делаются.
 
unknown845

unknown845

Member
26.05.2019
16
4
Всем привет!А у меня ошибку выбивает почему то :(Я так понял че то с пакетом
Код:
Traceback (most recent call last):
  File "/usr/lib/python3.5/tkinter/__init__.py", line 36, in <module>
    import _tkinter
ImportError: No module named '_tkinter'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "graf.py", line 1, in <module>
    from tkinter import *
  File "/usr/lib/python3.5/tkinter/__init__.py", line 38, in <module>
    raise ImportError(str(msg) + ', please install the python3-tk package')
ImportError: No module named '_tkinter', please install the python3-tk package
 
n3d.b0y

n3d.b0y

Red Team
19.01.2018
163
381
Всем привет!А у меня ошибку выбивает почему то :(Я так понял че то с пакетом
Код:
Traceback (most recent call last):
  File "/usr/lib/python3.5/tkinter/__init__.py", line 36, in <module>
    import _tkinter
ImportError: No module named '_tkinter'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "graf.py", line 1, in <module>
    from tkinter import *
  File "/usr/lib/python3.5/tkinter/__init__.py", line 38, in <module>
    raise ImportError(str(msg) + ', please install the python3-tk package')
ImportError: No module named '_tkinter', please install the python3-tk package
Тебе вообще ничего не сказала данное сообщение No module named '_tkinter', please install the python3-tk package или ты сразу решил спросить что не так не пытаясь вникнуть в ошибку?
 
  • Нравится
Реакции: Your 2B wify
unknown845

unknown845

Member
26.05.2019
16
4
Тебе вообще ничего не сказала данное сообщение No module named '_tkinter', please install the python3-tk package или ты сразу решил спросить что не так не пытаясь вникнуть в ошибку?
модуль не назван, пожалуйста установите питон3-тк пак :) пытаюсь установить питон новый он мне раздел persistent просит, а его нет в таилсе не устанавливал его
 
Y

Your 2B wify

Well-known member
01.06.2018
96
19
Pyqt это замечательно, если юзать без дезигнера. Сначала нужно разобраться как всё работает, а потом уже можно и конструктором пользоваться - очень время экономит.

P.S. А округлые кнопки и в Tkinter одной строчкой делаются.
Если не секрет, то как. Только из-за стилей css ушел на PyQt(и возненавидел всем сердцем)
 
Y

Your 2B wify

Well-known member
01.06.2018
96
19
Можно и свои стили тоже делать, кроме встроенных, но это конечно не за 1 строчку )))
В всё расписано.
И тут я понял, что невнимательность и лень создают мне очень много лишней работы)))
Сейчас еще раз подумал и как-то в падлу переписывать на tkinter хоть и вес приложухи будет в разы меньше
 
Последнее редактирование:
Мы в соцсетях: