有没有一种方法可以在编写后在某个对象上运行函数(python)

2024-09-29 00:12:12 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在用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),其中factdef 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__()产生了大致相同的结果

Tags: lambdatextnewcolumnbuttonrootcommandgrid