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

Новичку в программировании идея создания графического пользовательского интерфейса может показаться устрашающей сложной темной сетью. Мысль легко может стать непреодолимой; оставаясь зацикленным на низкоуровневой «магии» и задаваясь вопросом «как, черт возьми, кто-то вообще может превратить все эти тупые команды в работу визуальной сплоченности?»

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

Представляем TKinter

Чтобы спасти мою тяжелую работу от непонятности командной строки до простой старой безвестности-безвестности, я использовал TKinter, который включен в стандартную библиотеку Python. Есть много других способов создания интерфейса GUI на основе Python (каждый со своими компромиссами), но если вы новичок, TKinter будет надежным выбором, который может предложить хороший опыт обучения, потому что:

  • Это кроссплатформенный код, и ваш код будет легко работать в Linux, Windows и Mac OS X.
  • Он включен в стандартную библиотеку Python.
  • TKinter (и лежащий в его основе Tk) является зрелым и давно зарекомендовавшим себя с большим количеством доступной онлайн-справочной документации.

Однако важно отметить, что за эту простоту есть небольшая цена:

  • Чтобы любая система могла запускать вашу программу из коробки, на ней должен быть установлен Python. Это также верно для кода без графического интерфейса пользователя, который вы уже создавали. Однако намерение добавить графический интерфейс подразумевает неявный таргетинг на менее технически подкованную аудиторию. Кроме того, упаковать дополнительные зависимости в автономный установщик будет сложнее, чем в простое приложение командной строки. Если вы хотите представить простую установку на нескольких платформах, другие библиотеки GUI встретят меньшее сопротивление.

Основы верстки

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

# Imports the TKinter libraries.
from tkinter import Tk, ttk
# Instantiates the Tk class, which will be the top level item where all graphical components are stored.
root = Tk()
# Creates a simple button that does nothing when pushed, adding it to the root object.
button = ttk.Button(root, text = "This is a placebo that makes a pushy animation")
# Places the button in the window.
button.pack()
#Initializes the GUI
root.mainloop()

Обратите внимание, как в коде есть команда со словом упаковать. При этом вызывается менеджер геометрии. TKinter включает три варианта, обеспечивающих максимальную гибкость в управлении макетом. Pack - самый быстрый способ использовать для простых задач, поскольку он просто складывает элементы вверх / вниз или влево / вправо, но более сложные макеты могут выиграть от использования сетка и место .

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

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

Настройка событий кнопок

Уловка, позволяющая заставить пользовательский интерфейс реагировать на взаимодействие, заключается в обработке событий. Если хорошо спланировано с хорошим объектно-ориентированным дизайном, составить карту желаемого поведения будет намного проще, чем просто реализовать его. Ниже приведен базовый пример того, как можно вызвать простую подсказку для сохранения файла.

# Imports the TKinter libraries.
from tkinter import Tk, ttk, filedialog

class GUI(object):
    def __init__(self, master):
        self.master = master
        master.title("A test GUI")
# A button like the example before, except this one contains the "command" argument
        self.save_button = ttk.Button(self.master, text="Save File", command=self._save_dialogue)

        # Specifies the buttons placement using the pack geometry manager.
        self.save_button.pack()
    # Captures a filepath using tkinters built in file browser
    def _save_dialogue(self):
        filepath = filedialog.asksaveasfilename(initialdir = ".",title = "Select file",filetypes = (("jpg files","*.jpg"),("all files","*.*")))
        self.filepath = filepath

root = Tk()
example = GUI(root)
#Initializes the GUI
root.mainloop()

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

  • StringVar - когда кнопке нужно вывести строку текста.
  • BooleanVar - сохраняет либо 0 для false, либо 1 для true.
  • IntVar - используется для целых чисел.
  • DoubleVar - соответствует числам с плавающей запятой.

Более того, при назначении переменной из одного из этих классов она будет ссылаться на созданный объект, который содержит значение, а не само значение. Вам нужно будет получить к нему доступ через его метод .get ().

Изменение стиля

Теперь, после изучения некоторых основ, на этом этапе вы можете задаться вопросом, почему все ваши новые кнопки выглядят в ловушке 90-х. Они не должны быть такими. Вы можете получить доступ к атрибутам каждого элемента, настроив их по своему усмотрению.

Для начала полезно просмотреть список доступных семейств шрифтов. Без правильного соответствия любые изменения стиля шрифта не будут работать.

# Imports the TKinter libraries.
from tkinter import Tk, ttk
import tkinter.font as font

# Instantiates a TK object with a single button. This one will not be displayed as it doesn't call a geometry manager.
root = Tk()
button = ttk.Button(root, text = "Another ordinary button")

# Returns a list of supported fonts by TKinter.
print(font.families())

# This command lets us know what style an element uses.
print(button.winfo_class())

Этот блок кода также содержит метод, который показывает текущий стиль объекта в последней строке. В случае кнопки он печатает текст «TButton».

Настроенные стили можно легко создавать и применять к элементам в вашем графическом интерфейсе.

# Imports the TKinter libraries.
from tkinter import Tk, ttk
import tkinter.font as font
# Instantiates a TK object with a single button and calls the "pack" geometry manager.
root = Tk()
button = ttk.Button(root, text = "This button is crazy... but still does nothing")
button.pack()
# Creates a new style to apply to the button.
style = ttk.Style()
style.configure("Modified.TButton", background = "yellow", foreground = "blue", font = ('liberation serif', 24, 'italic'))
# Applies the style
button.config(style = "Modified.TButton")

root.mainloop()

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

Поскольку графический интерфейс, созданный с помощью TKinter (по умолчанию), интегрируется с внешним видом вашей ОС, из этого следует, что то, как он будет отображаться, будет немного отличаться в зависимости от выбранной вами ОС. Это может привести к неожиданным результатам.

В случае Mac OS X стиль TKinter по умолчанию основан на «морской» теме, которая предотвращает отображение цветов фона. Самым быстрым решением будет установка темы, которая не отменяет ваш выбор цвета фона.

# Imports the TKinter libraries.
from tkinter import Tk, ttk
# Gets a list of available themes on your system.
print(style.theme_names())
# Switches to the classic theme.
style.theme_use('classic')

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

Помимо основ

Приведенные здесь примеры - лишь малая часть того, что можно сделать в TKinter. Если вы застряли, есть много онлайн-ресурсов, которые могут вам помочь. Вы также можете поиграть с моим кодом. Навороты минимальны, и он выполняет свою работу, будучи автономным от основного модуля в отдельном файле Python.

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