Вам необходимо реализовать tk.StringVar()
, который может хранить значение в верхней части экрана калькулятора.Основные методы, которые нужно знать: .get()
и .set()
для этой переменной, это то, как вы получаете доступ к значению (.get()
) или обновляете его (.set()
).Вы должны связать это с записью с аргументом textvariable
.Как только вы это настроите, я изменил входы для вашей функции btnClick()
, чтобы все были строками.Когда у вас есть нужная строка (например, «12 + 5»), вы можете использовать встроенную в Python функцию eval()
для вычисления результата!Обратите внимание, что этот метод небезопасен, так как пользователи могут выполнять произвольный код с ним (взломать вашу программу) в зависимости от того, как вы его реализуете!Рабочая версия вашего кода выглядит следующим образом:
import tkinter
import tkinter.messagebox
class myGUI:
def __init__(self):
self.main_window = tkinter.Tk()
self.main_window.title('Calculator')
## Font
button_font = ('Verdana', 15)
entry_font = ('Verdana', 36)
## Define the frames
self.frameZero = tkinter.Frame(self.main_window)
self.frameOne = tkinter.Frame(self.main_window)
self.frameTwo = tkinter.Frame(self.main_window)
self.frameThree = tkinter.Frame(self.main_window)
self.frameFour = tkinter.Frame(self.main_window)
self.frameFive = tkinter.Frame(self.main_window)
## Define the entry area
self.entry_variable = tkinter.StringVar()
self.my_entry = tkinter.Entry(self.frameZero, textvariable=self.entry_variable, width=13, font=entry_font)
## Define the buttons
self.my_button1 = tkinter.Button(self.frameOne, text='1', command = lambda:btnClick("1"), height = 3, width = 7, font = button_font)
self.my_button2 = tkinter.Button(self.frameOne, text='2', command = lambda:btnClick("2"), height = 3, width = 7, font = button_font)
self.my_button3 = tkinter.Button(self.frameOne, text='3', command = lambda:btnClick("3"), height = 3, width = 7, font = button_font)
self.my_buttonadd = tkinter.Button(self.frameOne, text='+', command = lambda:btnClick("+"), height = 3, width = 7, font = button_font)
self.my_button4 = tkinter.Button(self.frameTwo, text='4', command = lambda:btnClick("4"), height = 3, width = 7, font = button_font)
self.my_button5 = tkinter.Button(self.frameTwo, text='5', command = lambda:btnClick("5"), height = 3, width = 7, font = button_font)
self.my_button6 = tkinter.Button(self.frameTwo, text='6', command = lambda:btnClick("6"), height = 3, width = 7, font = button_font)
self.my_buttonsub = tkinter.Button(self.frameTwo, text='-', command = lambda:btnClick("-"), height = 3, width = 7, font = button_font)
self.my_button7 = tkinter.Button(self.frameThree, text='7', command = lambda:btnClick("7"), height = 3, width = 7, font = button_font)
self.my_button8 = tkinter.Button(self.frameThree, text='8', command = lambda:btnClick("8"), height = 3, width = 7, font = button_font)
self.my_button9 = tkinter.Button(self.frameThree, text='9', command = lambda:btnClick("9"), height = 3, width = 7, font = button_font)
self.my_buttonmult = tkinter.Button(self.frameThree, text='*', command = lambda:btnClick("*"), height = 3, width = 7, font = button_font)
self.my_buttonC = tkinter.Button(self.frameFour, text='C', height = 3, width = 7, font = button_font)
self.my_button0 = tkinter.Button(self.frameFour, text='0', command = lambda:btnClick("0"), height = 3, width = 7, font = button_font)
self.my_buttonperiod = tkinter.Button(self.frameFour, text='.', command = lambda:btnClick("."), height = 3, width = 7, font = button_font)
self.my_buttondiv = tkinter.Button(self.frameFour, text='/', command = lambda:btnClick("/"), height = 3, width = 7, font = button_font)
self.my_buttoncalc = tkinter.Button(self.frameFive, text='Calculate', height = 4, width = 30, font = button_font, command=self.calculate)
## Pack the entry area
self.my_entry.pack(side = 'left')
## Pack the buttons
self.my_button1.pack(side = 'left')
self.my_button2.pack(side = 'left')
self.my_button3.pack(side = 'left')
self.my_buttonadd.pack(side = 'left')
self.my_button4.pack(side = 'left')
self.my_button5.pack(side = 'left')
self.my_button6.pack(side = 'left')
self.my_buttonsub.pack(side = 'left')
self.my_button7.pack(side = 'left')
self.my_button8.pack(side = 'left')
self.my_button9.pack(side = 'left')
self.my_buttonmult.pack(side = 'left')
self.my_buttonC.pack(side = 'left')
self.my_button0.pack(side = 'left')
self.my_buttonperiod.pack(side = 'left')
self.my_buttondiv.pack(side = 'left')
self.my_buttoncalc.pack(side = 'left')
## Pack the frames
self.frameZero.pack()
self.frameOne.pack()
self.frameTwo.pack()
self.frameThree.pack()
self.frameFour.pack()
self.frameFive.pack()
## Click button function
def btnClick(number_clicked):
self.entry_variable.set("{}{}".format(self.entry_variable.get(), number_clicked))
def calculate(self):
print("{}".format(eval(str(self.entry_variable.get()))))
self.entry_variable.set("{}".format(str(eval(str(self.entry_variable.get())))))
my_gui = myGUI()
my_gui.main_window.mainloop() # this should NOT be inside your class like you had it...
В целом мне понравился ваш фрейм-макет и общий дизайн.Лямбда-функции тоже были хороши!Добро пожаловать в StackOverflow.