Пишем калькулятор на Python и Tkinter
Hey python developers, in Python Calculator tutorial you will learn to create a simple GUI calculator. In this post i will show you how to develop a simple calculator using tkinter module in python. So let’s move further to create a simple python calculator.
Python offers a lot of options to develop GUI applications, but Tkinter is the most usable module for developing GUI(Graphical User Interface). Since Tkinter is cross-platform so it works on both windows and Linux. So here i am using Tkinter module to create a simple python calculator.
Python Calculator Tutorial – Getting Started With Tkinter
The fastest and easiest way of developing GUI applications in python is working with Tkinter. So let’s took a quick look on Tkinter.
What is Tkinter
- The Tkinter module (“Tk interface”) is the standard Python interface to the Tk GUI toolkit.
- Both Tk and Tkinter are available on most Unix platforms, as well as on Windows systems.
- If you work on Linux/Ubuntu then you have to install Tkinter module on your machine for running programs, but on windows you don’t need to install it because it comes with the default python installation.
Prerequisite For Python Calculator
For developing a simple GUI calculator in python you must have to prior knowledge of following –
Look Of A Simple GUI Python Calculator
Look at this calculator. Yup this is looking very cool. So now we have to create this calculator in python.
Python Calculator
On this calculator we can perform following simple mathematical calculations –
- Multiplication
- Addition
- Subtraction
- Division
And now we will start writing codes for making this. To create this we have to do four things –
- Importing Tkinter module
- Creating the main interface(window for calculator)
- Adding any number of widgets to the main interface
- Applying the event trigger on widgets
Creating Window For Calculator
First of all we will create a window of calculator. So write the following code.
from tkinter import *
# Creating frame for calculator
def iCalc(source, side):
storeObj = Frame(source, borderwidth=4, bd=4, bg=»powder blue»)
storeObj.pack(side=side, expand =YES, fill =BOTH)
return storeObj
# Creating Button
def button(source, side, text, command=None):
storeObj = Button(source, text=text, command=command)
storeObj.pack(side=side, expand = YES, fill=BOTH)
return storeObj
class app(Frame):
def __init__(self):
Frame.__init__(self)
self.option_add('*Font', 'arial 20 bold')
self.pack(expand = YES, fill =BOTH)
self.master.title('Calculator')
# Start the GUI
if __name__=='__main__':
app().mainloop()
# Creating frame for calculator storeObj = Frame(source, borderwidth=4, bd=4, bg=»powder blue») storeObj.pack(side=side, expand =YES, fill =BOTH)def button(source, side, text, command=None): storeObj = Button(source, text=text, command=command) storeObj.pack(side=side, expand = YES, fill=BOTH) self.option_add('*Font', 'arial 20 bold') self.pack(expand = YES, fill =BOTH) self.master.title('Calculator') |
Let’s see the output.
Python Calculator
We have created this frame successfully, now lets move on ahead.
Adding Display Widget
For creating display widget write the following code inside the class app.
display = StringVar()
Entry(self, relief=RIDGE, textvariable=display,
justify='right'
, bd=30, bg=»powder blue»).pack(side=TOP,
expand=YES, fill=BOTH)
Entry(self, relief=RIDGE, textvariable=display, , bd=30, bg=»powder blue»).pack(side=TOP, |
So now the output is –
Python Calculator
Adding Clear Button Widget
Now we will create a clear button. Whenever this button will be pressed all the stuffs from display will be erased. So write the following code for this.
for clearButton in ([«C»]):
erase = iCalc(self, TOP)
for ichar in clearButton:
button(erase, LEFT, ichar, lambda
storeObj=display, q=ichar: storeObj.set(''))
for clearButton in ([«C»]): for ichar in clearButton: button(erase, LEFT, ichar, lambda storeObj=display, q=ichar: storeObj.set('')) |
And now you can see the output.
Python Calculator
Adding Numbers And Symbols Widget
To add numbers and symbols inside the frame, you have to write the following code.
for numButton in («789/», «456*», «123-«, «0.+»):
FunctionNum = iCalc(self, TOP)
for iEquals in numButton:
button(FunctionNum, LEFT, iEquals, lambda
storeObj=display, q=iEquals: storeObj
.set(storeObj.get() + q))
for numButton in («789/», «456*», «123-«, «0.+»): FunctionNum = iCalc(self, TOP) for iEquals in numButton: button(FunctionNum, LEFT, iEquals, lambda storeObj=display, q=iEquals: storeObj .set(storeObj.get() + q)) |
And now you can see the output. It’s looking cool.
Python Calculator
Adding Equal Button
For implementing Equal button write the following code.
EqualButton = iCalc(self, TOP)
for iEquals in «=»:
if iEquals == '=':
btniEquals = button(EqualButton, LEFT, iEquals)
btniEquals.bind('', lambda e,s=self,
storeObj=display: s.calc(storeObj), '+')
else:
btniEquals = button(EqualButton, LEFT, iEquals,
lambda storeObj=display, s=' %s ' % iEquals: storeObj.set
(storeObj.get() + s))
EqualButton = iCalc(self, TOP) btniEquals = button(EqualButton, LEFT, iEquals) btniEquals.bind('', lambda e,s=self, storeObj=display: s.calc(storeObj), '+') btniEquals = button(EqualButton, LEFT, iEquals, lambda storeObj=display, s=' %s ' % iEquals: storeObj.set |
Графический калькулятор квадратных уравнений на Py
Рассмотрим пример создания графического интерфейса (GUI) на Python. В качестве «жертвы» напишем простенькую программу — решатель квадратных уравнений. Наше задание мы разобъем на несколько частей.
Часть первая: функция решения квадратного уравнения
- Напомним, что квадратным является уравнение вида:
- ax2 + bx + c = 0
- Есть несколько способов решить квадратное уравнение, мы выберем решение через дискриминант.
- Формула дискриминанта:
- D = b2 — 4ac.
- Используя эту формулу мы можем вывести решение. Если дискриминант больше или равен нулю, то корни уравнения высчитываются по формуле:
- x1,2 = (-b ± √D) ÷ (2a)
- Если же дискриминант меньше нуля, то уравнение не имеет решений.
- Превратим данные формулы в код:
def solver(a,b,c):
«»» Решает квадратное уравнение и выводит отформатированный ответ «»»
# находим дискриминант
D = b*b — 4*a*c
if D >= 0:
x1 = (-b + sqrt(D)) / (2*a)
x2 = (-b — sqrt(D)) / (2*a)
text = «The discriminant is: %s
X1 is: %s
X2 is: %s
» % (D, x1, x2)
else:
text = «The discriminant is: %s
This equation has no solutions» % D
return text
Чтобы все работало не забудьте импортировать функцию sqrt из модуля math.
from math import sqrt
Поскольку мы будем выводить результат в специально созданном виджете — мы сразу же вставляем полученный ответ в отформатированную строку и возвращаем ее.
Теперь пора переходить к созданию графической оболочки для нашего приложения.
Часть вторая: создаем GUI для программы
Для простоты будем создавать GUI встроенными средствами Python, поэтому импортируем все из библиотеки Tkinter:
from Tkinter import *
В Python версии 3.х название модуля следует писать с маленькой буквы — tkinter.
Далее создаем само окно и размещаем на нем необходимые виджеты:
# родительский элемент
root = Tk()
# устанавливаем название окна
root.title(«Quadratic calculator»)
# устанавливаем минимальный размер окна
root.minsize(325,230)
# выключаем возможность изменять окно
root.resizable(width=False, height=False)
# создаем рабочую область
frame = Frame(root)
frame.grid()
# поле для ввода первого аргумента уравнения (a)
a = Entry(frame, width=3)
a.grid(row=1,column=1,padx=(10,0))
# текст после первого аргумента
a_lab = Label(frame, text=»x**2+»).grid(row=1,column=2)
# поле для ввода второго аргумента уравнения (b)
b = Entry(frame, width=3)
b.grid(row=1,column=3)
# текст после второго аргумента
b_lab = Label(frame, text=»x+»).grid(row=1, column=4)
# поле для ввода третьего аргумента уравнения (с)
c = Entry(frame, width=3)
c.grid(row=1, column=5)
# текст после третьего аргумента
c_lab = Label(frame, text=»= 0″).grid(row=1, column=6)
# кнопка решить
but = Button(frame, text=»Solve»).grid(row=1, column=7, padx=(10,0))
# место для вывода решения уравнения
output = Text(frame, bg=»lightblue», font=»Arial 12″, width=35, height=10)
output.grid(row=2, columnspan=8)
# запускаем главное окно
root.mainloop()
Если вы в точности повторили указанный код, то после запуска скрипта у вас получится примерно следующее окно:
Отлично, программа работает. Осталось объяснить Python как связать эти две части.
Часть третья: объединяем все воедино
Задача перед нами стоит следующая — написать функцию, которая будет брать числа из полей для ввода, передавать их функции решения квадратного уравнения и выводить результат в поле для вывода. Конечно, все это можно реализовать в одной функции, но лучше разделить на несколько:
Функция вставки информации:
def inserter(value):
«»» Inserts specified value into text widget «»»
output.delete(«0.0″,»end»)
output.insert(«0.0»,value)
Функция inserter предельно проста: очищает поле для ввода и вставляет туда переданный ей аргумент value.
Напишем функцию обработки введенной информации. Назовем ее handler:
def handler():
«»» Get the content of entries and passes result to the output area «»»
try:
# make sure that we entered correct values
a_val = float(a.get())
b_val = float(b.get())
c_val = float(c.get())
inserter(solver(a_val, b_val, c_val))
except ValueError:
inserter(«Make sure you entered 3 numbers»)
В зависимости от данных введенных в поля для ввода передает функции inserter либо результат решения уравнения, либо сообщение о неверно введенных данных.
Чтобы все работало, следует изменить строку создания виджета Button следующим образом:
but = Button(frame, text=»Solve», command=handler).grid(row=1, column=7, padx=(10,0))
Теперь можно спокойно пользоваться нашей программой:
Дискриминант больше нуля | Дискриминант равен нулю |
|
|
Дискриминант меньше нуля. Решений нет | Введены не все аргументы |
Часть четвертая: необязательная
Можно добавить немного удобства для нашей программы. Проблема в том, что каждый раз вводя новые значения нам приходится удалять старые, что не очень комфортно. Напишем функцию, которая будет очищать поле для ввода после клика по нему.
def clear(event):
«»» Clears entry form «»»
caller = event.widget
caller.delete(«0», «end»)
Таким образом мы очищаем виджет, вызвавший данную функцию. Чтобы все работало, добавьте следующие строки после создания виджетов, но до размещения. Например, после строки a = Entry(… , но до строки a.grid(…
a.bind(«», clear)
b.bind(«», clear)
c.bind(«», clear)
Готово. Программа работает, Вы великолепны!
Исходный код калькулятора квадратных уравнений с GUI на GitHub
GUI Калькулятор на Python tkinter
В ходе статьи напишем GUI калькулятор на языке программирования Python с использованием модуля tkinter.
Написание GUI калькулятора
Для начала импортируем библиотеку tkinter:
Создадим объект класса 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():
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():
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
Заключение
В ходе статьи мы с Вами написали код для GUI калькулятора на языке программирования Python с использованием модуля tkinter. Надеюсь Вам понравилась статья, желаю удачи и успехов! ????
Вам также может понравиться
Scientific Calculator in Python using Tkinter
We have created a Scientific Calculator in Python which is a fully functional graphical user interface system that contains everything that IT students and computer-related courses will require for their college projects. The project has the same symbols, operators, and numbers as a regular calculator, however, the user cannot enter a number using their keyboard. Python is a computer language that may be used to do mathematical and scientific calculations.
Project Name: | Scientific Calculator in Python using Tkinter |
Abstract | It’s a GUI-based project used with the tkinter module to organize all the elements that work under Scientific Calculator in Python. |
Language/s Used: | Python |
IDE | PyCharm and Thonny(Recommended) |
Python version (Recommended): | Python 3.x |
Database: | Not used |
Type: | Desktop Application |
Recommended for | Beginners in Python and intermediates of Tkinter |
We will mostly understand our codes using comments. Now, let’s start.
import tkinter as tk
from math import *
# used to switch between units of rad, and deg
convert_constant = 1
inverse_convert_constant = 1
btn_params = {'padx': 16, 'pady': 1, 'bd': 4, 'fg': 'white', 'bg': 'black', 'font': ('arial', 18), 'width': 2, 'height': 2, 'relief': 'flat', 'activebackground': «black»}
In the above code sample, we imported the essential libraries, such as Tkinter, as well as all of the widget classes, including the message box module. This framework allows Python programmers to easily develop GUI components by utilizing the widgets included in the Tk toolkit. Math module for solving mathematical equations. I designed the buttons using the button function.
#Functions for the buttons
def fsin(arg):
return sin(arg * convert_constant)
def fcos(arg):
return cos(arg * convert_constant)
def ftan(arg):
return tan(arg * convert_constant)
def arcsin(arg):
return inverse_convert_constant * (asin(arg))
def arccos(arg):
return inverse_convert_constant * (acos(arg))
def arctan(arg):
return inverse_convert_constant * (atan(arg))
Here we define some functions to implement the Sin, Cos, Tan, Sin-¹, Cos-¹, Tan-¹. To do that we use some predefine python functions such as Sin(), Cos(), Tan(), asin(), acos(), atan().
# Визуализация калькулятора
На этом занятии создадим три визуальных представления калькулятора, используя отдельно три разных типа разметки: pack(), place(), grid(). Создадим окно:
from tkinter import * root = Tk()
root.title(«Calculator»)
root.mainloop()
Можно задать размер и запретить изменение размера окна, добавив соответствующие строки:
root.geometry(«400×300»)
root.resizable(False, False)
# Метод — pack()
Для дальнейшего переиспользования кода, создайте новый файл с названием app_calculator_pack.py.
Создадим в окне визуальный элемент однострочное текстовое поле:
num = StringVar() num.set(0) label = Entry(text=num, justify=RIGHT)
label.pack()
Результат выполнения:
Теперь создадим кнопку добавив следующий код:
Button(text=1).pack(side=LEFT)
Результат выполнения:
Добавим другие необходимые кнопки и получим следующий вид нашего калькулятора:
Разместим кнопки в три ряда. Для этого нам нужно воспользоваться вспомогательным виджетом Frame(). Для наглядности визуализации использую LabelFrame(). Важно соблюдать правильный порядок создания и размещения элементов! Логика создания элементов следующая:
- создаем рамку;
- создаем виджеты, которые будем хранить в нашей рамке и размещаем их в ней указав имя переменной, нашей рамки и упаковав виджет;
- пакуем нашу рамку в окно;
Код может выглядеть так:
from tkinter import * root = Tk()
frame_entry = LabelFrame(root, text=»1 ряд»)
frame_entry.pack()
label = Entry(frame_entry)
label.pack()
root.mainloop()
Результат выполнения:
После преобразования разметки с использованием рамки — LabelFrame() калькулятор должен иметь вид подобный следующему:
При использовании Frame() — рамки без подписей, виджеты должны просто располагаться рядами: вплотную друг к другу.
# Метод — place()
Для дальнейшего переиспользования кода, создайте новый файл с названием app_calculator_place.py.
Используя метод place() — места для размещения виджетов в окне достаточно указать абсолютное значение положения виджета от верхнего левого угла окна.
Пример кода может быть таким:
Button(text=1).place(x=10, y=50)
где x — расстояние горизонтали, а y — по вертикали.
Если смещение задать по 50 пикселей, то созданное окно может иметь вид:
# Метод — grid()
Для дальнейшего переиспользования кода, создайте новый файл с названием app_calculator_grid.py.
grid() — сетка, может являть наиболее удобным для создания сложных интерфейсов, т.к. проще в реализации, понимании и масштабируемости.
Пример кода с необходимыми атрибутами для решения задачи:
entry_display = Entry(textvariable=num, justify=RIGHT)
entry_display.grid(column=0, row=0, columnspan=5, sticky=NSEW)
При правильной полной реализации написания интерфейса результат может быть:
# Современная визуализация
ttk (themed tk) — это расширение tk с новым набором виджетов. В ttk используется новый движок для создания виджетов. Этот движок обладает поддержкой тем и стилей оформления. Благодаря этому виджеты ttk выглядят более естественно в различных операционных системах.
Начиная с версий python 2.7 и 3.1.2 в tkinter включён модуль для работы с ttk.
В ttk включены следующие виджеты, которые можно использовать вместо соответствующих виджетов tk: Button, Checkbutton, Entry, Frame, Label, LabelFrame, Menubutton, PanedWindow, Radiobutton, Scale и Scrollbar. Кроме того имеется несколько новых виджетов: Combobox, Notebook, Progressbar, Separator, Sizegrip и Treeview.
Чтобы переопределить основные виджеты Tk, импорт ttk должен следовать за импортом Tk:
from tkinter import *
from tkinter.ttk import *
Добавьте данные строки во все решения ваших калькуляторов и обратите внимания как измениться их внешний вид.
Вид калькулятора с методом pack() и виджетами ttk:
Вид калькулятора с методом place() и виджетами ttk:
Как мы видим после применения метода абсолютного позиционирования, проявляется основной недостаток: проблема масштабирования.
Вид калькулятора с методом grid() и виджетами ttk:
ПРИМЕЧАНИЕ
Нельзя использовать разные методы позиционирования элементов: pack(), grid(), place() в одном окне или одном фрейме!
# Упражнения
-
Для дальнейшего переиспользования кода, создайте новый файл с названием app_calculator_windows.py. Создайте калькулятор подобного вида, выбрав для этого наиболее удобный способ:
Символы «плюс минус» и «корня» можно получить, воспользовавшись функцией print():
print(chr(177))
print(chr(8730)) -
Добавьте функцию для цифровых кнопок: при нажатии на кнопку в текстовом поле допечатывается соответствующая цифра.
-
Добавьте функцию очистки экрана калькулятора для клавиши C: при нажатии кнопки происходит стирание содержимого дисплея и отображение 0.
-
Реализуйте работу кнопки
Создаем продвинутый калькулятор на Python с Tkinter
Здравствуйте! В этой публикации я хочу рассказать Вам, как сделать продвинутый калькулятор на Python 3 с Tkinter.
Итак, импортируем модули, которые нам понадобятся для нашей программы.
Библиотека tkinter нам необходима для создания окна, грубо говоря.
Модуль math нам нужен для математических операций.
from tkinter import *
from tkinter import messagebox
from tkinter import ttk
import math
import sys
Следующими двумя строками мы создаем окно и даем ему имя.
root = Tk()
root.title(«Calculator»)
Создаем список с именами будущих кнопок калькулятора. Я выбрал все самые интересные функции, чтобы продемонстрировать, как их реализовать.
bttn_list = [
«7», «8», «9», «+», «*»,
«4», «5», «6», «-«, «/»,
«1», «2», «3», «=», «xⁿ»,
«0», «.», «±», «C»,
«Exit», «π», «sin», «cos»,
«(«, «)»,»n!»,»√2″, ]
Следующим отрезком кода мы создаем кнопки для нашего калькулятора.
r = 1
c = 0
for i in bttn_list:
rel = «»
cmd=lambda x=i: calc(x)
ttk.Button(root, text=i, command = cmd, width = 10).grid(row=r, column = c)
c += 1
if c > 4:
c = 0
r += 1
В каждом калькуляторе есть, так называемое поле ввода, в которое пользователь вводит нужные данные для программы. Это могут быть цифры, функции и математические операции. Их можно вводить, как с клавиатуры, так и при нажатии на кнопку в калькуляторе.
Пример 1. Я нажимаю на кнопку «2» в калькуляторе и в этом поле ввода, отображается цифра 2.
В Python Tkinter поле ввода называется Entry, а, например, в Java Script — input.
calc_entry = Entry(root, width = 33)
calc_entry.grid(row=0, column=0, columnspan=5)
Мы подошли к основной задаче калькулятора — его функциям и логике.
До этого момента нами было создан внешний вид программы. Если бы Вы попробовали запустить ее и нажать на кнопку, Вам бы выскочила ошибка, ведь у нас вовсе нет функций калькулятора.
Приступим, пропишем нашему калькулятору логику и способность считать.
#логика калькулятора
def calc(key):
global memory
if key == «=»:
#исключение написания слов
str1 = «-+0123456789.*/)(»
if calc_entry.get()[0] not in str1:
calc_entry.insert(END, «First symbol is not number!»)
messagebox.showerror(«Error!», «You did not enter the number!»)
#исчисления
try:
result = eval(calc_entry.get())
calc_entry.insert(END, «=» + str(result))
except:
calc_entry.insert(END, «Error!»)
messagebox.showerror(«Error!», «Check the correctness of data»)
str1 = «-+0123456789.*/)(«
Этой кода мы разрешаем пользователю вводить только символы -+0123456789.*/)(, а остальные исключаем, запрещаем вводить.
В этом блоке кода мы используем функцию eval — это, если можно так сказать, компилятор внутри компилятора. Она будет считать в нашей программе.
По сути, мы обрабатываем функцию, что сработает при нажатии на кнопку «=».
Создаем функцию очищения поля ввода. Она будет срабатывать при нажатии на кнопку «C».
#очищение поля ввода
elif key == «C»:
calc_entry.delete(0, END)
Создаем функцию изменения минуса на плюс.
Пример 2. Мы ввели в окно Entry 5, при нажатии на кнопку «±», калькулятор выведет -5.
И наоборот, мы ввели -5, нажали на кнопку «±» и получили ответ от программы 5.
elif key == «±»:
if «=» in calc_entry.get():
calc_entry.delete(0, END)
try:
if calc_entry.get()[0] == «-«:
calc_entry.delete(0)
else:
calc_entry.insert(0, «-«)
except IndexError:
pass
Следующая функция — число pi. При нажатии на кнопку «П» программа выведет нам 3.14159265359, то есть число Pi. Вот тут нам и пригодилась библиотека math.
elif key == «π»:
calc_entry.insert(END, math.pi)
Функция выхода из программы. При нажатии на кнопку «Exit» окно Tkinter будет уничтожено и процесс остановлен. В этой функции нам нужна была библиотека sys.
elif key == «Exit»:
root.after(1,root.destroy)
sys.exit
Функция возведения в степень. Нужно ввести число, которое нужно возвести в степень. Далее программа выводит **. В Python этот символ означает возведение в степень 2**6 (возведение 2 в степень 6).
Мы используем для счета в программе eval, а значит можно выполнить это так же, как и в Питоне. Ну и в конце мы вводим необходимую степень.
Пример 3. Нам нужно 3 возвести в 5 степень. Вводим число 3, нажимаем на кнопку «xⁿ» (3**…
) и вводим необходимую степень, — 5 (3**5). Нажимаем на кнопку «=» и получаем ответ 243.
elif key == «xⁿ»:
calc_entry.insert(END, «**»)
Опишу сразу две функции, так, как они идентичны.
Функция sin x и cos x.
Все просто, при нажатии на клавишу sin или же cos мы получаем синус или косинус по данному числу.
elif key == «sin»:
calc_entry.insert(END, «=» + str(math.sin(int(calc_entry.get()))))
elif key == «cos»:
calc_entry.insert(END, «=» + str(math.cos(int(calc_entry.get()))))
Следующие две функции — скобки ) и (.
При нажатии на кнопку «)» мы получаем ), аналогично поступаем со второй функцией.
elif key == «(«:
calc_entry.insert(END, «(«)
elif key == «)»:
calc_entry.insert(END, «)»)
Функция получения факториала из данного числа.
elif key == «n!»:
calc_entry.insert(END, «=» + str(math.factorial(int(calc_entry.get()))))
Функция извлечения корня квадратного их данного числа.
elif key == «√2»:
calc_entry.insert(END, «=» + str(math.sqrt(int(calc_entry.get()))))
Функция, которая отвечает за очищение поля ввода при нажатии на кнопку «=».
else:
if «=» in calc_entry.get():
calc_entry.delete(0, END)
calc_entry.insert(END, key)
И последняя строка нашего кода — это «закрытие» окна tkinter.
root.mainloop()
Большое спасибо за прочтение данной публикации. Надеюсь она Вам была полезна.
рекрут
Источник