Как стать автором
Обновить

Tkinter: кратко для начинающих

Python - один из самых лёгких и популярных языков программирования. С помощью python решается достаточно много проблем - он сможет помочь в почти любой ситуации. Сегодня речь пойдёт о встроенной библиотеке tkinter. С помощью tkinter создаётся уникальный графический интерфейс для приложения на python.

В этой статье:

  1. Загрузка

  2. Синтаксис

  3. Компиляция

Tkinter вы можете скачать на официальном сайте или PyPi.

Загрузка

Для начала работы необходимо загрузить tkinter. Как я уже упоминал выше, он встроенный. Но встроен он начиная с версии Python3.

Загрузка для windows:

pip install tkinter

pip install --update tkinter

либо на всё том же PyPi выбираете tkinter для Windows, macOS или Linux.

Синтаксис

Теперь надо разобраться с синтаксисом tkinter. Сначала импортируем:

from tkinter import *

Теперь наша задача - сделать окно приложения. Для этого выберем название приложения (у меня это My App). Запишем

from tkinter import *
#исходный код

if __name__ == '__main__':
  #выполнение кода до загрузки
  root = Tk()
  root.title('My App') #заголовок
  root.mainloop() #отображение окна

пояснение

Сначала мы импортировали tkinter. После него идёт исходный код - виджеты, текст и тд. После if name == 'main' в отступах идёт код, который выполняется до загрузки, тоесть первее чем код в начале (не считая импорт). Сам код, который будет дальше, пишите до. .mainloop() отвечает за отображение окна - оно обязательно должно быть в конце кода. Если вы редактируете 2 окна, нужно ставить не в конец, а в начало кода второго окна (да я "очень хорошо" объясняю)

виджеты и текст

Теперь наша задача - ввести текст. Наше окно пока что пустое. Выглядит оно так:

P.S. картинка с интернета
P.S. картинка с интернета

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

lbl1 = Label(root, text='Привет')
lbl1.grid(column=0, row=0)
Виджет Label
Виджет Label

Row отвечает за строку, а column за столбец. Правда, у некоторых могут возникнуть проблемы в том, что вторая строка сдвинута. Для этого изменим grid на place

lbl1.place(x=10,y=10)

Нужно всего лишь указать место по x и y. Для удобства можете задать отдельный класс для управления переменными

class wid_prm():
  #класс управления переменными
  x     = 10
  y1    = 10
  y2    = 30
  y3    = 50
  x_y_z = 410
  #...

lbl1 = Label(root, text='...')
lbl2 = Label(root, text='...')

#плейсы
lbl1.place(x=x,y=y1)
lbl2.place(x=x,y=y2)

Думаю, тут всё понятно. Местоположение по x нужно использовать одно, если вы хотите использовать один столбец. Думаю, не стоит тратить время, нужно автоматизировать управление переменными x, y

for auto_prm in range(5):
  y1 = 10
  y1 += 20
  y1 -= 10
  y1 -= 10
  if y1 == 30:
    #останавливаем процесс
    y1 = 30
  else:
    y2          = y1 + 20
    y3          = y1 + 40
    y4          = y1 + 60
    y5,y6,y7,y8 = y1 * 2 + (y1 * 4)
    y990 = 4
    if y990 > 1:
      x = 10
    else:
      x = 5

А для чего это? Это для того, чтобы задать переменные автоматически. Просто скопируйте и вставьте эту часть кода в свой код.

Давайте теперь сделаем шрифт жирным в Label

lbl1 = Label(root,text='...',font=("Times New Roman",21,"bold"))

Вы, наверное, уже поняли, что за шрифт отвечает функция font. "bold" можете убрать, если вы не хотите жирный шрифт текста. 21 - размер текста в пикселях/мм.

Теперь попробуем использовать виджет Button - добавим кнопку

btn1 = Button(root, text='Не нажимай', command=clicked)
btn1.place(x=x_x,y=y1_y)

def clicked():
  print('Я же сказал...')

При нажатии на кнопку будет писать определённый текст по команде clicked. Вы можете дать любое название и любое содержимое команды.

Получается, что полный код пока-что выглядит так:

from tkinter import * #импорт
#исходный код

class wid_prm():
  #класс управления переменными
  x     = 10
  y1    = 10
  y2    = 30
  y3    = 50
  x_y_z = 410
  for auto_prm in range(5):
    y1 = 10
    y1 += 20
    y1 -= 10
    y1 -= 10
    if y1 == 30:
      #останавливаем процесс
      y1 = 30
    else:
      y2          = y1 + 20
      y3          = y1 + 40
      y4          = y1 + 60
      y5,y6,y7,y8 = y1 * 2 + (y1 * 4)
      y990 = 4
      if y990 > 1:
        x = 10
      else:
        x = 5
class prm_x_y():
  x_x = 10
  y1_y = 50

lbl1 = Label(root, text='...')
btn1 = Label(root, text='Не нажимай', command=clicked)
def clicked():
  print('Я же сказал...')

#плейсы
lbl1.place(x=x,y=y1)
btn1.place(x=x_x,y=y1_y)

if __name__ == '__main__':
  root = Tk()
  root.title('My App')
  root.geometry('400x400')
  root.mainloop()

Отлично получилось.

Виджет messagebox

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

from tkinter import *
from tkinter import messagebox

messagebox.showinfo('Заголовок', 'текст')

Это довольно круто для дополнительных виджетов.

Я, наверное, с синтаксисом закончу.

Компиляция

Первым делом нужно установить приложение auto-py-to-exe. Вы его можете установить либо с того же PyPi, либо через командную строку:

pip install auto-py-to-exe

pip install --update auto-py-to-exe

Вы скачаете приложение auto-py-to-exe от python. Вот как оно выглядит:

auto-py-to-exe
auto-py-to-exe

В script location указываете путь к файлу. Вот небольшой пример:

>Path to file:
>\Users\username\Desktop\file.py

Дальше всё просто. Укажите One File, если не хотите, чтобы файлы приложения засоряли ваш пк. Если хотите скрыть консоль (и оставить только окно tkinter), выберите Window Based.

Загрузите иконку приложения в Icon. И наконец-то нажимаете CONVERT .PY TO .EXE. Думаю, с последующим вы сами справитесь - в консоль будет выводиться всякая всячина, и в итоге вы успешно сконвертируете приложение на tkinter.


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

Теги:
Хабы:
Данная статья не подлежит комментированию, поскольку её автор ещё не является полноправным участником сообщества. Вы сможете связаться с автором только после того, как он получит приглашение от кого-либо из участников сообщества. До этого момента его username будет скрыт псевдонимом.