Статьи
Автор Admin На чтение 9 мин Просмотров 2.7к. Опубликовано 02.03.2023
Введение
В ходе статьи напишем GUI калькулятор на языке программирования Python с использованием модуля tkinter.
Написание GUI калькулятора
Для начала импортируем библиотеку tkinter:
from tkinter import *
Создадим объект класса Tk(), укажем разрешение окна 268×288, заголовок “Калькулятор” и запретим возможность изменять разрешение окна:
from tkinter import * root = Tk() root.geometry(«268×288») root.title(«Калькулятор») root.resizable(0, 0) root.mainloop()
Создадим виджет Frame() и отобразим его методом grid():
from tkinter import * root = Tk() root.geometry(«268×288») root.title(«Калькулятор») root.resizable(0, 0) frame_input = Frame(root) frame_input.grid(row=0, column=0, columnspan=4, sticky=»nsew») root.mainloop()
Добавим текстовое поле (виджет Entry()) на фрейм, укажем шрифт Arial 15 размера жирного начертания, толщину 24 и запретим возможность писать в нём. Отобразим его методом pack():
Кратко про Python Tkinter | Как создавать GUI Приложения
from tkinter import * root = Tk() root.geometry(«268×288») root.title(«Калькулятор») root.resizable(0, 0) frame_input = Frame(root) frame_input.grid(row=0, column=0, columnspan=4, sticky=»nsew») input_field = Entry(frame_input, font=’Arial 15 bold’, width=24, state=»readonly») input_field.pack(fill=BOTH) root.mainloop()
Далее создадим кортеж, в котором будут храниться кнопки будущего калькулятора:
from tkinter import * root = Tk() root.geometry(«268×288») root.title(«Калькулятор») root.resizable(0, 0) frame_input = Frame(root) frame_input.grid(row=0, column=0, columnspan=4, sticky=»nsew») input_field = Entry(frame_input, font=’Arial 15 bold’, width=24, state=»readonly») input_field.pack(fill=BOTH) buttons = ((‘7’, ‘8’, ‘9’, ‘/’, ‘4’), (‘4’, ‘5’, ‘6’, ‘*’, ‘4’), (‘1’, ‘2’, ‘3’, ‘-‘, ‘4’), (‘0’, ‘.’, ‘=’, ‘+’, ‘4’) ) root.mainloop()
Создадим пустую переменную expression строкового типа данных. Она нам пригодится для избежания ошибок в будущем. Также добавим кнопку, которая в последующем
будет служить для очищения текстового поля:
from tkinter import * root = Tk() root.geometry(«268×288») root.title(«Калькулятор») root.resizable(0, 0) frame_input = Frame(root) frame_input.grid(row=0, column=0, columnspan=4, sticky=»nsew») input_field = Entry(frame_input, font=’Arial 15 bold’, width=24, state=»readonly») input_field.pack(fill=BOTH) buttons = ((‘7’, ‘8’, ‘9’, ‘/’, ‘4’), (‘4’, ‘5’, ‘6’, ‘*’, ‘4’), (‘1’, ‘2’, ‘3’, ‘-‘, ‘4’), (‘0’, ‘.’, ‘=’, ‘+’, ‘4’) ) expression = «» button = Button(root, text=’C’, command=lambda: bt_clear()) button.grid(row=1, column=3, sticky=»nsew») root.mainloop()
Теперь добавим основные кнопки калькулятора с помощью цикла. И в основном, и во вложенном циклах будет по 4 итерации. Во вложенном цикле создаётся кнопка, с шириной 2, и высотой 3. Текстом будет являться поиндексное значение из кортежа buttons. Команда будет задаваться с помощью анонимной функции lambda, позиционироваться кнопки будут с помощью метода grid():
Как быстро сделать графический интерфейс на Python
from tkinter import * root = Tk() root.geometry(«268×288») root.title(«Калькулятор») root.resizable(0, 0) frame_input = Frame(root) frame_input.grid(row=0, column=0, columnspan=4, sticky=»nsew») input_field = Entry(frame_input, font=’Arial 15 bold’, width=24, state=»readonly») input_field.pack(fill=BOTH) buttons = ((‘7’, ‘8’, ‘9’, ‘/’, ‘4’), (‘4’, ‘5’, ‘6’, ‘*’, ‘4’), (‘1’, ‘2’, ‘3’, ‘-‘, ‘4’), (‘0’, ‘.’, ‘=’, ‘+’, ‘4’) ) expression = «» button = Button(root, text=’C’, command=lambda: bt_clear()) button.grid(row=1, column=3, sticky=»nsew») for row in range(4): for col in range(4): Button(root, width=2, height=3, text=buttons[row][col], command=lambda row=row, col=col: btn_click(buttons[row][col])).grid(row=row + 2, column=col, sticky=»nsew», padx=1, pady=1) root.mainloop()
Создадим функцию btn_click(), и в качестве аргумента укажем item. Сделаем переменную expression глобальной, после чего добавим конструкцию try … except:
from tkinter import * def btn_click(item): global expression try: pass except: pass root = Tk() root.geometry(«268×288») root.title(«Калькулятор») root.resizable(0, 0) frame_input = Frame(root) frame_input.grid(row=0, column=0, columnspan=4, sticky=»nsew») input_field = Entry(frame_input, font=’Arial 15 bold’, width=24, state=»readonly») input_field.pack(fill=BOTH) buttons = ((‘7’, ‘8’, ‘9’, ‘/’, ‘4’), (‘4’, ‘5’, ‘6’, ‘*’, ‘4’), (‘1’, ‘2’, ‘3’, ‘-‘, ‘4’), (‘0’, ‘.’, ‘=’, ‘+’, ‘4’) ) expression = «» button = Button(root, text=’C’, command=lambda: bt_clear()) button.grid(row=1, column=3, sticky=»nsew») for row in range(4): for col in range(4): Button(root, width=2, height=3, text=buttons[row][col], command=lambda row=row, col=col: btn_click(buttons[row][col])).grid(row=row + 2, column=col, sticky=»nsew», padx=1, pady=1) root.mainloop()
В try мы даём возможность писать в текстовое поле, приведя параметр state в normal. Далее к expression прибавляем item. И вводим результат в текстовое поле:
from tkinter import * def btn_click(item): global expression try: input_field[‘state’] = «normal» expression += item input_field.insert(END, item) except: pass root = Tk() root.geometry(«268×288») root.title(«Калькулятор») root.resizable(0, 0) frame_input = Frame(root) frame_input.grid(row=0, column=0, columnspan=4, sticky=»nsew») input_field = Entry(frame_input, font=’Arial 15 bold’, width=24, state=»readonly») input_field.pack(fill=BOTH) buttons = ((‘7’, ‘8’, ‘9’, ‘/’, ‘4’), (‘4’, ‘5’, ‘6’, ‘*’, ‘4’), (‘1’, ‘2’, ‘3’, ‘-‘, ‘4’), (‘0’, ‘.’, ‘=’, ‘+’, ‘4’) ) expression = «» button = Button(root, text=’C’, command=lambda: bt_clear()) button.grid(row=1, column=3, sticky=»nsew») for row in range(4): for col in range(4): Button(root, width=2, height=3, text=buttons[row][col], command=lambda row=row, col=col: btn_click(buttons[row][col])).grid(row=row + 2, column=col, sticky=»nsew», padx=1, pady=1) root.mainloop()
Зададим условие, что если на;ата кнопка “равно”, то будет подсчитываться результат методом eval(). После чего результат будет выведен в текстовое поле, а expression обнулится. В конце try снова замораживаем текстовое поле:
from tkinter import * def btn_click(item): global expression try: input_field[‘state’] = «normal» expression += item input_field.insert(END, item) if item == ‘=’: result = str(eval(expression[:-1])) input_field.insert(END, result) expression = «» input_field[‘state’] = «readonly» except: pass root = Tk() root.geometry(«268×288») root.title(«Калькулятор») root.resizable(0, 0) frame_input = Frame(root) frame_input.grid(row=0, column=0, columnspan=4, sticky=»nsew») input_field = Entry(frame_input, font=’Arial 15 bold’, width=24, state=»readonly») input_field.pack(fill=BOTH) buttons = ((‘7’, ‘8’, ‘9’, ‘/’, ‘4’), (‘4’, ‘5’, ‘6’, ‘*’, ‘4’), (‘1’, ‘2’, ‘3’, ‘-‘, ‘4’), (‘0’, ‘.’, ‘=’, ‘+’, ‘4’) ) expression = «» button = Button(root, text=’C’, command=lambda: bt_clear()) button.grid(row=1, column=3, sticky=»nsew») for row in range(4): for col in range(4): Button(root, width=2, height=3, text=buttons[row][col], command=lambda row=row, col=col: btn_click(buttons[row][col])).grid(row=row + 2, column=col, sticky=»nsew», padx=1, pady=1) root.mainloop()
В except мы будем ловить ошибку ZeroDivisionError, и говорить, что деление на 0 запрещено.
Также добавим ошибку синтаксиса, при которой будет просто выводиться слово “Ошибка”:
from tkinter import * def btn_click(item): global expression try: input_field[‘state’] = «normal» expression += item input_field.insert(END, item) if item == ‘=’: result = str(eval(expression[:-1])) input_field.insert(END, result) expression = «» input_field[‘state’] = «readonly» except ZeroDivisionError: input_field.delete(0, END) input_field.insert(0, ‘Ошибка (деление на 0)’) except SyntaxError: input_field.delete(0, END) input_field.insert(0, ‘Ошибка’) root = Tk() root.geometry(«268×288») root.title(«Калькулятор») root.resizable(0, 0) frame_input = Frame(root) frame_input.grid(row=0, column=0, columnspan=4, sticky=»nsew») input_field = Entry(frame_input, font=’Arial 15 bold’, width=24, state=»readonly») input_field.pack(fill=BOTH) buttons = ((‘7’, ‘8’, ‘9’, ‘/’, ‘4’), (‘4’, ‘5’, ‘6’, ‘*’, ‘4’), (‘1’, ‘2’, ‘3’, ‘-‘, ‘4’), (‘0’, ‘.’, ‘=’, ‘+’, ‘4’) ) expression = «» button = Button(root, text=’C’, command=lambda: bt_clear()) button.grid(row=1, column=3, sticky=»nsew») for row in range(4): for col in range(4): Button(root, width=2, height=3, text=buttons[row][col], command=lambda row=row, col=col: btn_click(buttons[row][col])).grid(row=row + 2, column=col, sticky=»nsew», padx=1, pady=1) root.mainloop()
Теперь добавим функцию для очищения текстового поля. Внутри неё делаем переменную expression глобальной, опять же размораживаем текстовое поле, очищаем его, и снова замораживаем:
from tkinter import * def btn_click(item): global expression try: input_field[‘state’] = «normal» expression += item input_field.insert(END, item) if item == ‘=’: result = str(eval(expression[:-1])) input_field.insert(END, result) expression = «» input_field[‘state’] = «readonly» except ZeroDivisionError: input_field.delete(0, END) input_field.insert(0, ‘Ошибка (деление на 0)’) except SyntaxError: input_field.delete(0, END) input_field.insert(0, ‘Ошибка’) def bt_clear(): global expression expression = «» input_field[‘state’] = «normal» input_field.delete(0, END) input_field[‘state’] = «readonly» root = Tk() root.geometry(«268×288») root.title(«Калькулятор») root.resizable(0, 0) frame_input = Frame(root) frame_input.grid(row=0, column=0, columnspan=4, sticky=»nsew») input_field = Entry(frame_input, font=’Arial 15 bold’, width=24, state=»readonly») input_field.pack(fill=BOTH) buttons = ((‘7’, ‘8’, ‘9’, ‘/’, ‘4’), (‘4’, ‘5’, ‘6’, ‘*’, ‘4’), (‘1’, ‘2’, ‘3’, ‘-‘, ‘4’), (‘0’, ‘.’, ‘=’, ‘+’, ‘4’) ) expression = «» button = Button(root, text=’C’, command=lambda: bt_clear()) button.grid(row=1, column=3, sticky=»nsew») for row in range(4): for col in range(4): Button(root, width=2, height=3, text=buttons[row][col], command=lambda row=row, col=col: btn_click(buttons[row][col])).grid(row=row + 2, column=col, sticky=»nsew», padx=1, pady=1) root.mainloop()
В ходе статьи мы с Вами написали код для GUI калькулятора на языке программирования Python с использованием модуля tkinter. Надеюсь Вам понравилась статья, желаю удачи и успехов!
Источник: it-start.online
Python — десктопное приложение с графическим интерфейсом
Python имеет встроенный пакет GUI, который позволяет легко создавать такие формы:
В этом примере используется пакет tkinter. Форма выше принимает значение, введенное в поле ввода, возводит его в квадрат и отображает обратно в поле ввода, таким образом, квадратную кнопку можно нажать снова. Довольно стандартное приложение.
Интересная часть этой статьи — сделать приложение автономным и отправить его кому-то, у кого не установлен python и не нужно работать с консолью. Это 3 маленьких шага, необходимых для написания кода:
- Сохраните код Python как *.pyw
- Установите «pip install pyinstaller»
- Создайте исполняемый файл с помощью «pyinstaller -w InputOutputConsole.pyw»
Когда вы выполните эти шаги, результат будет сохранен в той же папке:
В папке dist находится EXE-файл, который может запустить небольшое приложение. Код приложения здесь:
from tkinter import * class Application(Frame): def __init__(self, master=None): Frame.__init__(self, master) self.grid() self.create_widgets() def create_widgets(self): self.display_label = Label(self, text=»Enter value to square:») self.display_label.grid(row=0, column=0) self.input_field = Entry(self, bd = 5) self.input_field.grid(row=0,column=1) self.result_label = Label(self, text=»Result will be here:») self.result_label.grid(row=1, column=0) self.calculation_button = Button(self, text=»Square!», command=self.calculation) self.calculation_button.grid(row=3,column=3) self.quit_button = Button(self, text=»Quit», command=self.master.destroy) self.quit_button.grid(row=4,column=10) def calculation(self): new_val = int(self.input_field.get())**2 self.result_label[‘text’] = new_val self.input_field.delete(‘0’, ‘end’) self.input_field.insert(‘0’, str(new_val)) if __name__ == «__main__»: app = Application() app.mainloop()
Это небольшой пример того как можно реализовать десктопное приложение с помощью Python
Сделать сборку под OSX можно при помощи утилиты dmgbuild
Источник: dev-gang.ru
Eel Python библиотека для создания интерфейсов на HTML
В этой статье вы прочитаете что за библиотека Eel для Python и самое главное как с ней работать думаю многим будет очень интересно и самое главное полезно.
Также если вас интересуют Python библиотеки, то вам возможно будет интересно «Быстрый старт библиотеки scikit-image для Python», уверен будет интересно.
Что за Python библиотека Eel:
Как понятно из названия статьи, это библиотека которая позволяет создавать графический интерфейс с помощью HTML, что на мой взгляд проще, чем например использовать библиотеку Tkinter, хотя возможно такой вариант не самый быстрый.
Как устанавливается Python библиотека Eel:
Тут как обычно для Python нужно использовать Pip, вот что вводим в терминал:
pip install eel
После этого вы можете работать с библиотекой.
Работа с Python библиотекой Eel:
Тут стоит сказать, что всё что дальше, это перевод части официальной документации, ссылку на документацию найдёте ниже.
Структура каталогов:
Приложение Eel будет разделено на интерфейс, состоящий из различных файлов веб-технологий (.html, .js, .css), и серверную часть, состоящую из различных скриптов Python.
Все файлы внешнего интерфейса должны быть помещены в один каталог (при необходимости их можно разделить на папки внутри него).
my_python_script . py < — Python scripts
other_python_module . py
static_web_folder / < — Web folder
main_page . html
style . css
Запуск приложения:
Предположим, вы поместили все файлы внешнего интерфейса в каталог с именем web, включая вашу стартовую страницу main.html, затем приложение запускается следующим образом;
import eel
eel . init ( ‘web’ )
eel . start ( ‘main.html’ )
Это запустит веб-сервер с настройками по умолчанию (http://localhost:8000) и откроет браузер на http://localhost:8000/main.html.
Если установлен Chrome или Chromium, то по умолчанию он будет открываться в режиме приложения (с флагом —app cmdline), независимо от того, какой браузер ОС по умолчанию установлен (это поведение можно переопределить).
Параметры приложения:
Дополнительные параметры могут быть переданы в eel.start() в качестве аргументов ключей словаря.
Некоторые из параметров включают режим, в котором находится приложение (например, «chrome»), порт, на котором работает приложение, имя хоста приложения и добавление дополнительных флагов командной строки.
Начиная с версии Eel v0.12.0, для start() доступны следующие параметры:
- mode — Cтрока, указывающая, какой браузер использовать (например, «chrome», «electro», «edge», «custom»). Также может быть None или False , чтобы не открывать окно. По умолчанию: «хром»;
- host — Строка, указывающая, какое имя хоста использовать для сервера Bottle. По умолчанию: «localhost»);
- port — Целое число, указывающий, какой порт использовать для сервера Bottle. Используйте 0 для автоматического выбора порта. По умолчанию: 8000;
- block — Буливое значение, указывающее, должен ли вызов start() блокировать вызывающий поток. По умолчанию: True ;
- jinja_templates — Строка, указывающая папку, используемую для шаблонов Jinja2, например. «my_templates». По умолчанию: None ;
- cmdline_args — Список строк, которые необходимо передать команде для запуска браузера. Например, мы можем добавить дополнительные флаги для Chrome; eel.start(‘main.html’, mode=’chrome-app’, port=8080, cmdline_args=[‘—start-fullscreen’, ‘—browser-startup-dialog’]) . По умолчанию: [] ;
- size — Кортеж целых чисел, указывающий (ширину, высоту) главного окна в пикселях. По умолчанию: None ;
- position — Кортеж целых чисел, указывающий (слева, сверху) главного окна в пикселях. По умолчанию: None ;
- geometry — Словарь, определяющий размер и положение для всех окон. Ключи должны быть относительным путем страницы, а значения должны быть словарем вида . По умолчанию: <> ;
- close_callback — Лямбда или функция, которая вызывается, когда веб-сокет для окна закрывается (т. е. когда пользователь закрывает окно). Он должен принимать два аргумента; строка, представляющая собой относительный путь только что закрытой страницы и список других веб-сокетов, которые все еще открыты. По умолчанию: None ;
- app — Экземпляр Bottle, который будет использоваться, а не создавать новый. Это можно использовать для установки промежуточного программного обеспечения на экземпляр перед запуском угря, например. для управления сессиями, аутентификации и т. д.;
- shutdown_delay — Таймер, настраиваемый для механизма обнаружения выключения Eel, при котором, когда какой-либо веб-сокет закрывается, он ожидает shutdown_delay секунд, а затем проверяет, есть ли сейчас какие-либо соединения с веб-сокетом. Если нет, то Eel закрывается. В случае, если пользователь закрыл браузер и хочет выйти из программы. По умолчанию значение shutdown_delay равно 1,0 секунде;
Экспонирование функций:
В дополнение к файлам в папке внешнего интерфейса библиотека Javascript будет обслуживаться в «/eel.js». Вы должны включать это на любые страницы:
Источник: prognote.ru