Я выяснил, что не так. Приведенное ниже выражение вызывает проблему.
('-' 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 '/')
это будет оцениваться как '-' петь. Потому что вы объединяете их с условием или. В результате вы проверяете только знак минус.