Как я могу изменить свой код, чтобы при нажатии кнопки он отображался в поле ввода? - PullRequest
1 голос
/ 08 мая 2019

Я использую tkinter на Python 3, чтобы сделать калькулятор. У меня есть макет закончен. Сейчас я пытаюсь сделать так, чтобы при нажатии кнопки он отображался в поле ввода. Например, если я нажму кнопку 2, а затем кнопку +, а затем кнопку 3, я хочу, чтобы она отображалась в поле ввода в верхней части программы.

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 buttons

        self.my_button1 = tkinter.Button(self.frameOne, text='1', command = lambda:btnClick(my_button1), height = 3, width = 7, font = button_font)
        self.my_button2 = tkinter.Button(self.frameOne, text='2', command = lambda:btnClick(my_button2), height = 3, width = 7, font = button_font)
        self.my_button3 = tkinter.Button(self.frameOne, text='3', command = lambda:btnClick(my_button3), height = 3, width = 7, font = button_font)
        self.my_buttonadd = tkinter.Button(self.frameOne, text='+', command = lambda:btnClick(my_buttonadd), height = 3, width = 7, font = button_font)
        self.my_button4 = tkinter.Button(self.frameTwo, text='4', command = lambda:btnClick(my_button4), height = 3, width = 7, font = button_font)
        self.my_button5 = tkinter.Button(self.frameTwo, text='5', command = lambda:btnClick(my_button5), height = 3, width = 7, font = button_font)
        self.my_button6 = tkinter.Button(self.frameTwo, text='6', command = lambda:btnClick(my_button6), height = 3, width = 7, font = button_font)
        self.my_buttonsub = tkinter.Button(self.frameTwo, text='-', command = lambda:btnClick(my_buttonsub), height = 3, width = 7, font = button_font)
        self.my_button7 = tkinter.Button(self.frameThree, text='7', command = lambda:btnClick(my_button7), height = 3, width = 7, font = button_font)
        self.my_button8 = tkinter.Button(self.frameThree, text='8', command = lambda:btnClick(my_button8), height = 3, width = 7, font = button_font)
        self.my_button9 = tkinter.Button(self.frameThree, text='9', command = lambda:btnClick(my_button9), height = 3, width = 7, font = button_font)
        self.my_buttonmult = tkinter.Button(self.frameThree, text='*', command = lambda:btnClick(my_buttonmult), 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(my_button0), height = 3, width = 7, font = button_font)
        self.my_buttonperiod = tkinter.Button(self.frameFour, text='.', command = lambda:btnClick(my_buttonperiod), height = 3, width = 7, font = button_font)
        self.my_buttondiv = tkinter.Button(self.frameFour, text='/', command = lambda:btnClick(my_buttondiv), height = 3, width = 7, font = button_font)
        self.my_buttoncalc = tkinter.Button(self.frameFive, text='Calculate', height = 4, width = 30, font = button_font)

        ## Define the entry area
        self.my_entry = tkinter.Entry(self.frameZero, width = 13, font = entry_font)

        ## 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(numbers):
            global operator
            operator=operator + str(numbers)
            my_entry = self.set(operator)


        tkinter.mainloop()

my_gui = myGUI()

1 Ответ

1 голос
/ 09 мая 2019

Вам необходимо реализовать 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...