Приложение "Калькулятор" не работает должным образом - PullRequest
0 голосов
/ 09 мая 2020

Я здесь новенький и только начал изучать python примерно 10 месяцев go. Я в основном пытаюсь практиковать, чтобы убедиться, что то, чему я научился, не ускользнет от меня. Ниже приведен код, который я написал для калькулятора:

from tkinter import *


class Calculator(Frame):
"""Calculator class inherits from Frame Class"""

def __init__(self, master):  # constructs calculator App
    super().__init__(master)
    self.master.title("Calculator")
    self.master.configure(bg='teal')
    self.configure(bg='dark blue')
    self.grid(row=0, column=0, padx=15, pady=15)
    self.entry_text = StringVar()

    # Line of code below creates entry
    self.entry = Entry(self, textvariable=self.entry_text,
                       font=('times new roman', 30))
    # set value for each button number
    self.btn1_var = IntVar()
    self.btn1_var.set('1')
    self.btn2_var = IntVar()
    self.btn2_var.set('2')
    self.btn3_var = IntVar()
    self.btn3_var.set('3')
    self.btn4_var = IntVar()
    self.btn4_var.set('4')
    self.btn5_var = IntVar()
    self.btn5_var.set('5')
    self.btn6_var = IntVar()
    self.btn6_var.set('6')
    self.btn7_var = IntVar()
    self.btn7_var.set('7')
    self.btn8_var = IntVar()
    self.btn8_var.set('8')
    self.btn9_var = IntVar()
    self.btn9_var.set('9')
    self.btn0_var = IntVar()
    self.btn0_var.set('0')

    # position entry widget in window
    self.entry.grid(row=0, column=1, columnspan=3, sticky=N + S + W + E)

    # create buttons for each number
    self.btn1 = Button(self, text='1', width=20, height=2, command=self.num1)
    self.btn1.grid(row=1, column=1)
    self.btn2 = Button(self, text='2', width=20, height=2, command=self.num2)
    self.btn2.grid(row=1, column=2)
    self.btn3 = Button(self, text='3', width=20, height=2, command=self.num3)
    self.btn3.grid(row=1, column=3)
    self.btn4 = Button(self, text='4', width=20, height=2, command=self.num4)
    self.btn4.grid(row=2, column=1)
    self.btn5 = Button(self, text='5', width=20, height=2, command=self.num5)
    self.btn5.grid(row=2, column=2)
    self.btn6 = Button(self, text='6', width=20, height=2, command=self.num6)
    self.btn6.grid(row=2, column=3)
    self.btn7 = Button(self, text='7', width=20, height=2, command=self.num7)
    self.btn7.grid(row=3, column=1)
    self.btn8 = Button(self, text='8', width=20, height=2, command=self.num8)
    self.btn8.grid(row=3, column=2)
    self.btn9 = Button(self, text='9', width=20, height=2, command=self.num9)
    self.btn9.grid(row=3, column=3)
    self.btn0 = Button(self, text='0', width=20, height=2, command=self.num0)
    self.btn0.grid(row=4, column=2)

    # create buttons for each arithmetic operation
    self.sub_btn = Button(self, text='-', width=20, height=2, command=self.subtract)
    self.sub_btn.grid(row=5, column=0)
    self.add_btn = Button(self, text='+', width=20, height=2, command=self.add)
    self.add_btn.grid(row=5, column=1)
    self.mul_btn = Button(self, text='*', width=20, height=2, command=self.multiply)
    self.mul_btn.grid(row=5, column=2)
    self.div_btn = Button(self, text='/', width=20, height=2, command=self.divide)
    self.div_btn.grid(row=5, column=3)
    self.eq_btn = Button(self, text='=', width=20, height=2, command=self.equals_to)
    self.eq_btn.grid(row=5, column=4)

# event handlers for arithmetic operations
def subtract(self):
    """include minus sign in entry"""
    self.entry.insert(END, '-')

def add(self):
    """include + sign in entry"""
    self.entry.insert(END, '+')

def divide(self):
    """include / sign in entry"""
    self.entry.insert(END, '/')

def multiply(self):
    """include * sign in entry"""
    self.entry.insert(END, '*')

def equals_to(self):
    """evaluate arithmetic expression in entry"""
    if self.entry_text.get() is '':
        self.entry_text.set('Ans=' + '0')
    elif 'Ans' in self.entry_text.get():
        self.entry_text.set(self.entry_text.get())
    elif self.entry_text.get()[0] == '0':
        self.entry_text.set('Ans=' + self.entry_text.get()[1:])
    else:
        self.entry_text.set('Ans=' + str(eval(self.entry_text.get())))

# event handlers for pressing a number(button number)
def num1(self):
    """include 1 in entry"""
    if 'Ans=' in self.entry.get() and ('-' or '+' or '*' or '/') in self.entry.get():
        self.entry.delete(0, 4)
    elif 'Ans=' in self.entry.get():
        self.entry.delete(0, END)
    self.entry.insert(END, self.btn1_var.get())

def num2(self):
    """include 2 in entry"""
    if 'Ans=' in self.entry.get() and ('-' or '+' or '*' or '/') in self.entry.get():
        self.entry.delete(0, 4)
    elif 'Ans=' in self.entry.get():
        self.entry.delete(0, END)
    self.entry.insert(END, self.btn2_var.get())

def num3(self):
    """include 3 in entry"""
    if 'Ans=' in self.entry.get() and ('-' or '+' or '*' or '/') in self.entry.get():
        self.entry.delete(0, 4)
    elif 'Ans=' in self.entry.get():
        self.entry.delete(0, END)
    self.entry.insert(END, self.btn3_var.get())

def num4(self):
    """include 4 in entry"""
    if 'Ans=' in self.entry.get() and ('-' or '+' or '*' or '/') in self.entry.get():
        self.entry.delete(0, 4)
    elif 'Ans=' in self.entry.get():
        self.entry.delete(0, END)
    self.entry.insert(END, self.btn4_var.get())

def num5(self):
    """include 5 in entry"""
    if 'Ans=' in self.entry.get() and ('-' or '+' or '*' or '/') in self.entry.get():
        self.entry.delete(0, 4)
    elif 'Ans=' in self.entry.get():
        self.entry.delete(0, END)
    self.entry.insert(END, self.btn5_var.get())

def num6(self):
    """include 6 in entry"""
    if 'Ans=' in self.entry.get() and ('-' or '+' or '*' or '/') in self.entry.get():
        self.entry.delete(0, 4)
    elif 'Ans=' in self.entry.get():
        self.entry.delete(0, END)
    self.entry.insert(END, self.btn6_var.get())

def num7(self):
    """include 7 in entry"""
    if 'Ans=' in self.entry.get() and ('-' or '+' or '*' or '/') in self.entry.get():
        self.entry.delete(0, 4)
    elif 'Ans=' in self.entry.get():
        self.entry.delete(0, END)
    self.entry.insert(END, self.btn7_var.get())

def num8(self):
    """include 8 in entry"""
    if 'Ans=' in self.entry.get() and ('-' or '+' or '*' or '/') in self.entry.get():
        self.entry.delete(0, 4)
    elif 'Ans=' in self.entry.get():
        self.entry.delete(0, END)
    self.entry.insert(END, self.btn8_var.get())

def num9(self):
    """include 9 in entry"""
    if 'Ans=' in self.entry.get() and ('-' or '+' or '*' or '/') in self.entry.get():
        self.entry.delete(0, 4)
    elif 'Ans=' in self.entry.get():
        self.entry.delete(0, END)
    self.entry.insert(END, self.btn9_var.get())

def num0(self):
    """include 0 in entry"""
    if 'Ans=' in self.entry.get() and ('-' or '+' or '*' or '/') in self.entry.get():
        self.entry.delete(0, 4)
    elif 'Ans=' in self.entry.get():
        self.entry.delete(0, END)
    self.entry.insert(END, self.btn0_var.get())


root = Tk()
Calculator(root)
root.mainloop()

Я пытаюсь продолжить выражение arithmeti c с ответом, который я получил из предыдущего выражения arithmeti c на калькуляторе. Это работает, но после, может быть, второй попытки или я пытаюсь добавить более одного операнда, это как-то портится, оставляя только последнее набранное мной число. Если я добавляю какой-либо оператор arithmeti c и пытаюсь добавить число, он очищает все остальное, что я написал, и оставляет только последнее введенное число. Был бы очень признателен за помощь в этом. Не стесняйтесь запускать код и дайте мне знать, что с ним не так.

PS Я знаю, что мог бы использовать для l oop для создания кнопок, я даже сделал это, но запутался, связывая событие обработчики с соответствующими кнопками, поэтому простое кодирование их построчно казалось лучшим способом на данный момент go ....

1 Ответ

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

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

('-' or '+' or '*' or '/') in self.entry.get()

Если вы замените его приведенным ниже выражением, ваша проблема будет решена.

any(item in self.entry.get() for item in ('-', '+', '*', '/'))

Следует заменить его для целых чисел.

Вот я их заменил, готов к использованию :)

from tkinter import *


class Calculator(Frame):
    """Calculator class inherits from Frame Class"""

    def __init__(self, master):  # constructs calculator App
        super().__init__(master)
        self.master.title("Calculator")
        self.master.configure(bg='teal')
        self.configure(bg='dark blue')
        self.grid(row=0, column=0, padx=15, pady=15)
        self.entry_text = StringVar()

        # Line of code below creates entry
        self.entry = Entry(self, textvariable=self.entry_text,
                        font=('times new roman', 30))
        # set value for each button number
        self.btn1_var = IntVar()
        self.btn1_var.set('1')
        self.btn2_var = IntVar()
        self.btn2_var.set('2')
        self.btn3_var = IntVar()
        self.btn3_var.set('3')
        self.btn4_var = IntVar()
        self.btn4_var.set('4')
        self.btn5_var = IntVar()
        self.btn5_var.set('5')
        self.btn6_var = IntVar()
        self.btn6_var.set('6')
        self.btn7_var = IntVar()
        self.btn7_var.set('7')
        self.btn8_var = IntVar()
        self.btn8_var.set('8')
        self.btn9_var = IntVar()
        self.btn9_var.set('9')
        self.btn0_var = IntVar()
        self.btn0_var.set('0')

        # position entry widget in window
        self.entry.grid(row=0, column=1, columnspan=3, sticky=N + S + W + E)

        # create buttons for each number
        self.btn1 = Button(self, text='1', width=20, height=2, command=self.num1)
        self.btn1.grid(row=1, column=1)
        self.btn2 = Button(self, text='2', width=20, height=2, command=self.num2)
        self.btn2.grid(row=1, column=2)
        self.btn3 = Button(self, text='3', width=20, height=2, command=self.num3)
        self.btn3.grid(row=1, column=3)
        self.btn4 = Button(self, text='4', width=20, height=2, command=self.num4)
        self.btn4.grid(row=2, column=1)
        self.btn5 = Button(self, text='5', width=20, height=2, command=self.num5)
        self.btn5.grid(row=2, column=2)
        self.btn6 = Button(self, text='6', width=20, height=2, command=self.num6)
        self.btn6.grid(row=2, column=3)
        self.btn7 = Button(self, text='7', width=20, height=2, command=self.num7)
        self.btn7.grid(row=3, column=1)
        self.btn8 = Button(self, text='8', width=20, height=2, command=self.num8)
        self.btn8.grid(row=3, column=2)
        self.btn9 = Button(self, text='9', width=20, height=2, command=self.num9)
        self.btn9.grid(row=3, column=3)
        self.btn0 = Button(self, text='0', width=20, height=2, command=self.num0)
        self.btn0.grid(row=4, column=2)

        # create buttons for each arithmetic operation
        self.sub_btn = Button(self, text='-', width=20, height=2, command=self.subtract)
        self.sub_btn.grid(row=5, column=0)
        self.add_btn = Button(self, text='+', width=20, height=2, command=self.add)
        self.add_btn.grid(row=5, column=1)
        self.mul_btn = Button(self, text='*', width=20, height=2, command=self.multiply)
        self.mul_btn.grid(row=5, column=2)
        self.div_btn = Button(self, text='/', width=20, height=2, command=self.divide)
        self.div_btn.grid(row=5, column=3)
        self.eq_btn = Button(self, text='=', width=20, height=2, command=self.equals_to)
        self.eq_btn.grid(row=5, column=4)

    # event handlers for arithmetic operations
    def subtract(self):
        """include minus sign in entry"""
        self.entry.insert(END, '-')

    def add(self):
        """include + sign in entry"""
        self.entry.insert(END, '+')

    def divide(self):
        """include / sign in entry"""
        self.entry.insert(END, '/')

    def multiply(self):
        """include * sign in entry"""
        self.entry.insert(END, '*')

    def equals_to(self):
        """evaluate arithmetic expression in entry"""
        if self.entry_text.get() is '':
            self.entry_text.set('Ans=' + '0')
        elif 'Ans' in self.entry_text.get():
            self.entry_text.set(self.entry_text.get())
        elif self.entry_text.get()[0] == '0':
            self.entry_text.set('Ans=' + self.entry_text.get()[1:])
        else:
            self.entry_text.set('Ans=' + str(eval(self.entry_text.get())))

    # event handlers for pressing a number(button number)
    def num1(self):
        """include 1 in entry"""
        if 'Ans=' in self.entry.get() and any(item in self.entry.get() for item in ('-', '+', '*', '/')):
            self.entry.delete(0, 4)
        elif 'Ans=' in self.entry.get():
            self.entry.delete(0, END)
        self.entry.insert(END, self.btn1_var.get())

    def num2(self):
        """include 2 in entry"""
        if 'Ans=' in self.entry.get() and any(item in self.entry.get() for item in ('-', '+', '*', '/')):
            self.entry.delete(0, 4)
        elif 'Ans=' in self.entry.get():
            self.entry.delete(0, END)
        self.entry.insert(END, self.btn2_var.get())

    def num3(self):
        """include 3 in entry"""
        if 'Ans=' in self.entry.get() and any(item in self.entry.get() for item in ('-', '+', '*', '/')):
            self.entry.delete(0, 4)
        elif 'Ans=' in self.entry.get():
            self.entry.delete(0, END)
        self.entry.insert(END, self.btn3_var.get())

    def num4(self):
        """include 4 in entry"""
        if 'Ans=' in self.entry.get() and any(item in self.entry.get() for item in ('-', '+', '*', '/')):
            self.entry.delete(0, 4)
        elif 'Ans=' in self.entry.get():
            self.entry.delete(0, END)
        self.entry.insert(END, self.btn4_var.get())

    def num5(self):
        """include 5 in entry"""
        if 'Ans=' in self.entry.get() and any(item in self.entry.get() for item in ('-', '+', '*', '/')):
            self.entry.delete(0, 4)
        elif 'Ans=' in self.entry.get():
            self.entry.delete(0, END)
        self.entry.insert(END, self.btn5_var.get())

    def num6(self):
        """include 6 in entry"""
        if 'Ans=' in self.entry.get() and any(item in self.entry.get() for item in ('-', '+', '*', '/')):
            self.entry.delete(0, 4)
        elif 'Ans=' in self.entry.get():
            self.entry.delete(0, END)
        self.entry.insert(END, self.btn6_var.get())

    def num7(self):
        """include 7 in entry"""
        if 'Ans=' in self.entry.get() and any(item in self.entry.get() for item in ('-', '+', '*', '/')):
            self.entry.delete(0, 4)
        elif 'Ans=' in self.entry.get():
            self.entry.delete(0, END)
        self.entry.insert(END, self.btn7_var.get())

    def num8(self):
        """include 8 in entry"""
        if 'Ans=' in self.entry.get() and any(item in self.entry.get() for item in ('-', '+', '*', '/')):
            self.entry.delete(0, 4)
        elif 'Ans=' in self.entry.get():
            self.entry.delete(0, END)
        self.entry.insert(END, self.btn8_var.get())

    def num9(self):
        """include 9 in entry"""
        if 'Ans=' in self.entry.get() and any(item in self.entry.get() for item in ('-', '+', '*', '/')):
            self.entry.delete(0, 4)
        elif 'Ans=' in self.entry.get():
            self.entry.delete(0, END)
        self.entry.insert(END, self.btn9_var.get())

    def num0(self):
        """include 0 in entry"""
        if 'Ans=' in self.entry.get() and any(item in self.entry.get() for item in ('-', '+', '*', '/')):
            self.entry.delete(0, 4)
        elif 'Ans=' in self.entry.get():
            self.entry.delete(0, END)
        self.entry.insert(END, self.btn0_var.get())


root = Tk()
Calculator(root)
root.mainloop()

Позвольте мне объяснить. Вы хотели проверить, есть ли в тексте «Ans», а также спеть в тексте. Первая часть условия if работает хорошо. Во второй части немного сложнее.

В python кортежи разделяются запятыми. ('-' or '+' or '*' or '/') это будет оцениваться как '-' петь. Потому что вы объединяете их с условием или. В результате вы проверяете только знак минус.

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