Перейти к содержимому

Как сделать кнопку в питоне

  • автор:

Создание кнопки в Python

Звезда активнаЗвезда активнаЗвезда активнаЗвезда не активнаЗвезда не активна

Для того, чтобы создать кнопку в Python 3 с обработкой нажатия мыши, понадобится использовать пакет или библиотеку tkinter. По сути tkinter package является стандартным интерфейсом Python для инструментария Tk GUI. Поэтому его можно использовать для создания кнопки. Для осваивания данного языка это будет интересная и полезная практика. Для начала следует импортировать данный пакет и протестировать был ли он установлен в используемой вами среде разработки.

Установить tkinter в Линуксе (Убунту) можно через терминал (вызов терминала: Alt-Ctrl-T) набрав в терминале sudo apt-get install python3-tk. Там же в терминале можно узнать и установленную версию Питона (python — v).

Протестировать и узнать установлен ли tkinter в среде разработки можно следующим образом:

import tkinter from tkinter import ttk tkinter._test()

Самый простой пример кнопки без обработчика нажатия мыши можно прописать так:

from tkinter import * from tkinter.ttk import * root = Tk() button = Button(root, text ="Button") button.pack() root.mainloop()

Ещё пример простой до безобразия кнопки в Python 3:

import tkinter from tkinter import ttk root = tkinter.Tk() button = ttk.Button(root, text ="Press me") button.pack() root.mainloop()

Создание кнопки в Python 3 при помощи tkinter

А вот интересный пример, в котором сразу три кнопки в одном фрейме (окне) при помощи библиотеки tkinter:

  1. первая кнопка обрабатывает нажатие мыши и выводит после него сообщение на экран,
  2. вторая кнопка при нажатии выводит актуальное на данный момент время на самой кнопке,
  3. третья кнопка после нажатия на неё завершает свою работу (работу всего виджета).

Импорт пакета как tk (сокращённо). Импорт библиотеки времени.

import tkinter as tk import time

Создание окна, в котором будут отображаться кнопки. master — родительский виджет. pack () — упаковщик для размещения блоков один под другим. Создание виджета.

class Application(tk.Frame): def __init__(self, master=None): super().__init__(master) self.pack() self.create_widgets()

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

сommand прописывает обращение к методу нажатия мыши на кнопку. Упаковщик pack необходим для размещения блоков один над другим.

def create_widgets(self): self.hi_there = tk.Button(self, font="Verdana", bg="red", fg="black", width=7, height=4) self.hi_there["text"] = "Hello User\n(click me)" self.hi_there["command"] = self.say_hi self.hi_there.pack(side="top")

Создание второй кнопки Выхода из программы в том же методе создания виджета. Создание кнопки выхода из программы с удалением всех виджетов. Упаковщик для размещения блоков один под другим.

self.quit = tk.Button(self, text="QUIT", font="Arial", fg="red", bg="white", width=7,height=4, command=root.destroy) self.quit.pack(side="bottom")

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

self.button = tk.Button(self) self.button['text'] = time.strftime('%H:%M:%S') self.button['command'] = self.button_clicked self.button.pack(side="bottom")

Метод нажатия кнопки. Создание метода для вывода информации после нажатия на кнопку.

def say_hi(self): print("text after press the button")

Создание метода, который выведет актуальное на данный момент время.

def button_clicked(self): self.button['text'] = time.strftime('%H:%M:%S')

Создание собственного окна.

root = tk.Tk()

Создание экземпляра класса.

app = Application(master=root)

Запуск главного цикла обработки событий.

app.mainloop()

А вот и полностью весь код примера трёх кнопок, который по кусочкам описан выше:

import tkinter as tk import time class Application(tk.Frame): def __init__(self, master=None): super().__init__(master) self.pack() self.create_widgets() def create_widgets(self): self.hi_there = tk.Button(self, font="Verdana", bg="red", fg="black", width=7, height=4) self.hi_there["text"] = "Hello User\n(click me)" self.hi_there["command"] = self.say_hi self.hi_there.pack(side="top") self.quit = tk.Button(self, text="QUIT", font="Arial", fg="red", bg="white", width=7,height=4, command=root.destroy) self.quit.pack(side="bottom") self.button = tk.Button(self) self.button['text'] = time.strftime('%H:%M:%S') self.button['command'] = self.button_clicked self.button.pack(side="bottom") def say_hi(self): print("text after press the button") def button_clicked(self): self.button['text'] = time.strftime('%H:%M:%S') root = tk.Tk() app = Application(master=root) app.mainloop()

Успехов в учёбе!

P.S. Полезные ссылки для освоения материала по созданию кнопок в Python на tkinter:

  • 25.1. tkinter — Python interface to Tcl/Tk
  • Курс по библиотеке Tkinter языка Python

Структура приложения и работа с кнопкам / tkinter 1

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

Простой пример

Возьмем в качестве примера следующую программу:

 
from tkinter import * root = Tk() 
btn = Button(root, text="Нажми!")
btn.config(command=lambda: print("Привет, Tkinter!"))
btn.pack(padx=120, pady=30)
root.title("Мое приложение Tkinter")
root.mainloop()

Она создает окно с кнопкой, которая выводит Привет, Tkinter! каждый раз при нажатии. Кнопка расположена с внутренним отступом 120px по горизонтальной оси и 30px – по вертикальной. Последняя строка запускает основной цикл, который обрабатывает все пользовательские события и обновляет интерфейс до закрытия основного окна.

Простое окно с кнопкой

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

Wildcard-импорты ( from … import * ) считаются плохой практикой, поскольку они загрязняют глобальное пространство имен. Здесь они используются для иллюстрации анти-паттерна, который часто встречается в примерах онлайн.

Эти проблемы настройки решаются с помощью базовых техник объектно-ориентированного программирования, что считается хорошей практикой для любых типов программ на Python.

Правильный пример

Чтобы улучшить модуль простой программы, стоит определить несколько классов, которые станут обертками вокруг глобальных переменных:

 
import tkinter as tk 
class App(tk.Tk):
def __init__(self):
super().__init__()
self.btn = tk.Button(self, text="Нажми!",
command=self.say_hello)
self.btn.pack(padx=120, pady=30)

def say_hello(self):
print("Привет, Tkinter!")

if __name__ == "__main__":
app = App()
app.title("Мое приложение Tkinter")
app.mainloop()

Теперь каждая переменная хранится в конкретной области видимости, включая функцию command , которая находится в отдельном методе.

Как работает это приложение?

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

Затем класс App определяется как подкласс Tk , который теперь ссылается на пространство имен tk . Для правильной инициализации базового класса, вызывается метод __init__() класса Tk с помощью встроенной функции super() . За это отвечают следующие строки:

 
class App(tk.Tk): 
def __init__(self):
super().__init__()
# .

Теперь есть ссылка на экземпляр App с переменной self . Так что виджет кнопки будет добавлен как атрибут класса.

Это может казаться излишним для такой простой программы, но подобный рефакторинг помогает работать с каждой отдельной частью. Создание кнопки отделено от обратного вызова, которые исполняется при нажатии. А генерация приложения перемещена в if __name__ == "main" , что является стандартной практикой для исполняемых скриптов в Python.

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

Дополнение о структуре приложения

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

Однако может быть более удобно разделять классы Frame или Toplevel особенно для больших программ, где, например, есть несколько окон. Это все потому что у приложения Tkinter должен быть один экземпляр Tk , а система создает их автоматически при создании экземпляра виджета до создания экземпляра самого Tk .

Помните, что это не влияет на структуру класса App , поскольку у всех классов виджетов есть метод mainloop , который запускает основной цикл Tk .

Работа с кнопками

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

Как создать кнопку

Следующий блок содержит кнопку с изображением, которая выключается при нажатии, а также список кнопок с разными типами анимации после нажатия:

import tkinter as tk

RELIEFS = [tk.SUNKEN, tk.RAISED, tk.GROOVE, tk.RIDGE, tk.FLAT]

class ButtonsApp(tk.Tk):
def __init__(self):
super().__init__()
self.img = tk.PhotoImage(file="python.gif")
self.btn = tk.Button(self, text="Кнопка с изображением",
image=self.img, compound=tk.LEFT,
command=self.disable_btn)
self.btns = [self.create_btn(r) for r in RELIEFS]
self.btn.pack()
for btn in self.btns:
btn.pack(padx=10, pady=10, side=tk.LEFT)

def create_btn(self, relief):
return tk.Button(self, text=relief, relief=relief)

def disable_btn(self):
self.btn.config(state=tk.DISABLED)

if __name__ == "__main__":
app = ButtonsApp()
app.mainloop()

Цель программы — показать разные варианты настройки, которые могут быть использованы при создании виджета кнопки.

После выполнения кода выше, возвращается следующее:

Разные варианты настройки кнопок

Простейший способ создания экземпляра Button — использование параметра text для настройки метки кнопки и command , который ссылается на вызываемую функцию при нажатии кнопки.

В этом примере также добавляется PhotoImage с помощью параметра image , который имеет приоритет над строкой text . Этот параметр используется для объединения изображения и текста на одной кнопке, определяя местоположение, где будет находиться картинка. Он принимает следующие константы: CENTER, BOTTOM, LEFT, RIGHT и TOP.

Второй ряд кнопок создается с помощью сгенерированного списка и списка значений RELIEF . Метка каждой кнопки соответствует константе, так что можно заметить разницу во внешнем виде.

Для сохранения ссылки на экземпляр PhotoImage использовался атрибут, хотя его и нет вне метода __init__ . Причина в том, что изображения удаляются при сборке мусора. Это и происходит, если объявить их в качестве локальных переменных.

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

Следующий урок: Работа с текстом (в разработке)

Tkinter/Button

Button (рус. Кнопка) — виджет Tkinter, представляющий из себя обычную кнопку.

Параметры [ ]

  • LEFT — по левому краю
  • CENTER — по центру
  • RIGHT — по правому краю
  • SUNKEN
  • RAISED
  • GROOVE
  • RIDGE
  • NORMAL — состояние по умолчанию
  • DISABLED — кнопка не работает
  • ACTIVE — состояние, когда наведён курсор

activebackground [ ]

btn = Button(root, text='Button', activebackground='red')

activeforeground [ ]

btn = Button(root, text='Button', activeforeground='#fff')

command [ ]

def changecolor(): btn['bg'] = 'blue' btn = Button(root, text='Button', command=changecolor)

font [ ]

btn = Button(root, text='Button', font='Courier 20')

Создание надстройки Python в виде кнопки

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

Этот раздел поможет вам создать новую кнопку на новой панели инструментов, используя мастер надстроек Python . Прежде, чем начать этот процесс, убедитесь, что вы создали проект надстройки ArcMap и указали параметры проекта. Более подробная информация доступна в разделе Создание проекта надстройки. Хотя здесь демонстрируется процесс создания кнопки для ArcMap, таким же образом вы можете добавить кнопку в любое другое приложение ArcGIS Desktop . В этом разделе будет рассмотрен процесс создания простой кнопки для приближения к выбранным объектам. После этого класс Python, созданный мастером надстроек, будет рассмотрен более подробно с целью исследовать свойства и методы, которые обеспечивают функциональность вашей кнопки.

Создание надстройки в виде кнопки состоит из следующих этапов:

Иллюстрация установки свойств кнопки

  1. Создание панели инструментов или меню После того, как вы ввели все необходимые настройки проекта, нажмите на закладку Содержимое надстройки (Add-In Contents) и определите функциональность, которую изменит ваша надстройка. Кнопка может находиться на панели инструментов или в меню. В этом примере будет создана новая панель инструментов, которая будет выступать в качестве контейнера для кнопки. Более подробная информация о создании собственной панели инструментов доступна в разделе Создание надстройки в виде панели инструментов.
  2. Создание кнопки После того, как вы ввели настройки панели инструментов, вы можете создать новую кнопку. Нажмите правой кнопкой мыши на панели инструментов под названием "Toolbar" и выберите Новая кнопка (New Button) . Кнопка имеет ряд параметров, которые необходимо ввести. Ниже представлен список всех параметров с описанием каждого из них. Эти свойства сохраняются в файле config.xml вашего проекта.

Свойство Описание
Название (обязательный) Определяет название кнопки. Следующая иллюстрация показывает, как название используется в менеджере надстроек ArcGIS для определения доступных видов изменения функционала (тип надстройки обозначен в скобках): Иллюстрация параметров кнопки в менеджер надстроекСледующая иллюстрация показывает, как название используется в качестве текстовой метки, которая позволяет найти кнопку на панели инструментов. Иллюстрация заголовка кнопки на панели инструментов
Класс (обязательный) Класс Python, который выполняется при нажатии на кнопку в настольном приложении. Вся бизнес-логика вашей кнопки находится в классе Python. При создании своего класса используйте способ наименования, принятый в Python, при котором каждое слово начинается с большой буквы (например, "ZoomToSelectedFeatures", а не "zoomtoselectedfeatures").
ID (обязательный) Уникальное название, которое поможет идентифицировать кнопку. Вы можете создать более одной кнопки в проекте, и этот идентификатор позволит вам отличать кнопки друг от друга. Желательно заменить идентификатор по умолчанию на более понятное значение. Идентификатор не должен содержать пробелов. Вы можете использовать символ подчеркивания для того, чтобы соединять слова. Нельзя использовать ключевые слова Python. Список зарезервированных слов доступен в документации Python.
Всплывающая подсказка (дополнительный) Краткое описание, которое появляется, когда курсор мыши оказывается над кнопкой в приложении.
Сообщение (дополнительный) Подробное описание того, какие функции выполняет кнопка. Это сообщение появляется под всплывающей подсказкой (ToolTip), когда курсор мыши оказывается над кнопкой.
Изображение (дополнительный) Здесь может быть изображение размером 16 х 16 пикселей, обозначающее вашу кнопку. Изображение должно быть в одном из популярных форматов (то есть .bmp , .jpg и так далее). Изображение будет скопировано в папку Images, созданную в проекте надстройки.

Последняя секция настроек кнопки — это заголовок и содержание справки. Эти свойства позволяют вам предоставить информацию, которая отобразится, когда пользователь запустит контекстно-зависимую справку. Контекстно-зависимая справка представляет собой всплывающие сообщения, которые остаются на экране, пока пользователь не нажмет на другой объект. Секция контекстно-зависимой справки состоит из следующих параметров:

Свойство Описание
Заголовок (дополнительный) Описывает тематику раздела справки.
Содержание (дополнительный)
  1. Отредактируйте скрипт Python, находящийся в папке Install , расположенной в рабочей папке, которую вы создали при помощи мастера. В скрипте будет находиться класс с названием, которое вы указали в параметре Class выше. Не изменяйте название этого класса, поскольку это название содержится в файле config.xml . Описание каждой функции и каждого свойства класса доступно в разделе Класс кнопки.
  2. Добавьте следующий код в функцию onClick(self) . Этот код добавляет функциональность, которая позволяет приближать выбранные объекты.
# Implementation of OnClick method of Button's class def onClick(self): # Get the current map document and the first data frame. mxd = arcpy.mapping.MapDocument('current') df = arcpy.mapping.ListDataFrames(mxd)[0] # Call the zoomToSelectedFeatures() method of the data frame class df.zoomToSelectedFeatures() 

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

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