我正在用python创建一个tkinter
应用程序,我面临一个问题
from tkinter import *
import math
root = Tk()
root.title("PyCalc")
root.resizable(False, False)
inpbox = Entry(root, width=40, borderwidth=5, font=("Courier New", 16))
inpbox.grid(row=0, column=0, columnspan=5, padx=0, pady=10)
def clicked(num):
inpbox.focus()
if num == 'C': inpbox.delete(0, END)
elif num == '=':
inpbox.icursor(END)
text = inpbox.get().replace('√', "math.sqrt").replace('^', '**')
inpbox.delete(0, END)
try: num = eval(text)
except: inpbox.insert(END, '?')
else:
try: inpbox.insert(inpbox.index(INSERT), float(num))
except: inpbox.insert(END, '?')
elif num == 'B':
inpbox.delete(inpbox.index(INSERT)-1, inpbox.index(INSERT))
else: inpbox.insert(inpbox.index(INSERT), num)
inpbox.focus()
button00 = Button(root, text='00', padx=17, pady=20, font=("Courier New", 32), command=lambda: clicked('00'))
button0 = Button(root, text='0', padx=30, pady=20, font=("Courier New", 32), command=lambda: clicked('0'))
button1 = Button(root, text='1', padx=30, pady=20, font=("Courier New", 32), command=lambda: clicked('1'))
button2 = Button(root, text='2', padx=30, pady=20, font=("Courier New", 32), command=lambda: clicked('2'))
button3 = Button(root, text='3', padx=30, pady=20, font=("Courier New", 32), command=lambda: clicked('3'))
button4 = Button(root, text='4', padx=30, pady=20, font=("Courier New", 32), command=lambda: clicked('4'))
button5 = Button(root, text='5', padx=30, pady=20, font=("Courier New", 32), command=lambda: clicked('5'))
button6 = Button(root, text='6', padx=30, pady=20, font=("Courier New", 32), command=lambda: clicked('6'))
button7 = Button(root, text='7', padx=30, pady=20, font=("Courier New", 32), command=lambda: clicked('7'))
button8 = Button(root, text='8', padx=30, pady=20, font=("Courier New", 32), command=lambda: clicked('8'))
button9 = Button(root, text='9', padx=30, pady=20, font=("Courier New", 32), command=lambda: clicked('9'))
buttonplus = Button(root, text='+', padx=30, pady=20, font=("Courier New", 32), command=lambda: clicked('+'))
buttonsub = Button(root, text='-', padx=30, pady=20, font=("Courier New", 32), command=lambda: clicked('-'))
buttonmult = Button(root, text='*', padx=30, pady=20, font=("Courier New", 32), command=lambda: clicked('*'))
buttondiv = Button(root, text='/', padx=30, pady=20, font=("Courier New", 32), command=lambda: clicked('/'))
buttonsqr = Button(root, text='√', padx=30, pady=20, font=("Courier New", 32), command=lambda: clicked('√('))
buttonsq = Button(root, text='x²', padx=17, pady=20, font=("Courier New", 32), command=lambda: clicked('^2'))
buttonpow = Button(root, text='xⁿ', padx=17, pady=20, font=("Courier New", 32), command=lambda: clicked('^'))
buttoneq = Button(root, text='=', padx=91, pady=20, font=("Courier New", 32), command=lambda: clicked('='))
buttonc = Button(root, text='C', padx=30, pady=20, font=("Courier New", 32), command=lambda: clicked('C'))
buttonb = Button(root, text='Õ', padx=11, pady=20, font=("Wingdings", 31), command=lambda: clicked('B'))
buttonfact = Button(root, text='x!', padx=17, pady=20, font=("Courier New", 32), command=lambda: clicked('!'))
buttonlp = Button(root, text='(', padx=30, pady=20, font=("Courier New", 32), command=lambda: clicked('('))
buttonrp = Button(root, text=')', padx=30, pady=20, font=("Courier New", 32), command=lambda: clicked(')'))
buttonsq.grid(row=1, column=4)
buttonplus.grid(row=1, column=3)
button9.grid(row=1, column=2)
button8.grid(row=1, column=1)
button7.grid(row=1, column=0)
buttonpow.grid(row=2, column=4)
buttonsub.grid(row=2, column=3)
button6.grid(row=2, column=2)
button5.grid(row=2, column=1)
button4.grid(row=2, column=0)
buttonsqr.grid(row=3, column=4)
buttonmult.grid(row=3, column=3)
button3.grid(row=3, column=2)
button2.grid(row=3, column=1)
button1.grid(row=3, column=0)
buttonfact.grid(row=4, column=4)
buttondiv.grid(row=4, column=3)
buttonb.grid(row=4, column=2)
button00.grid(row=4, column=1)
button0.grid(row=4, column=0)
buttonc.grid(row=5, column=4)
buttoneq.grid(row=5, column=2, columnspan=2)
buttonrp.grid(row=5, column=1)
buttonlp.grid(row=5, column=0)
root.mainloop()
单击感叹号时,将显示!
。但它对等式没有影响,并导致错误(在屏幕上留下问号)
出于美学目的,我希望避免在等式中添加!(
或fact(
;这会占用太多的空间,而且这不是你的方式
理论上,如果我输入3!
,程序将输出6
我试过:
setattr(int, 'factorial', fact)
,其中fact
是def fact(self): return math.factorial(self)
(数学已经导入到程序中)只会返回错误: File "<pyshell#0>", line 1, in <module>
setattr(int, 'factorial', fact)
TypeError: can't set attributes of built-in/extension type 'int'
我曾希望我可以添加到clicked()
函数第三行的.replace
链:text = inpbox.get().replace('√', "math.sqrt").replace('^', '**').replace('!', '.factorial()')
,但由于python不允许我将该属性添加到数字中,所以这是徒劳的
int.__setattr__()
产生了大致相同的结果李>
目前没有回答
相关问题 更多 >
编程相关推荐