如何解决计算器窗口 10 但缺少 MC、M+、M-、MU 和 MR 按钮
我实际上不知道这些按钮(MC、M+、M-、MU 和 MR)如何工作以及如何在不使用 lambda 函数的情况下操作它们我想寻求一些帮助以便我可以将其升级为实际100% 与 Windows 10 计算器相似。
这是我的代码,对我有很大帮助:
from tkinter import *
import math
full_stop = 1
for_calculation = None
def button(parent,text,font,bg,width,pad=1):
btn = Button(parent,text=text,font=font,bg=bg,width=width,height=2,relief=FLAT,bd=0,padx=pad)
return btn
def zero(event=""):
if expression.get().startswith("0") and len(expression.get()) == 1:
expression.set("")
if len(expression.get()) < 30:
expression.set(expression.get() + "0")
# num 1
def one(event=""):
if expression.get().startswith("0") and len(expression.get()) == 1:
expression.set("")
if len(expression.get()) < 30:
expression.set(expression.get() + "1")
# num 2
def two(event=""):
if expression.get().startswith("0") and len(expression.get()) == 1:
expression.set("")
if len(expression.get()) < 30:
expression.set(expression.get() + "2")
# num 3
def three(event=""):
if expression.get().startswith("0") and len(expression.get()) == 1:
expression.set("")
if len(expression.get()) < 30:
expression.set(expression.get() + "3")
# num 4
def four(event=""):
if expression.get().startswith("0") and len(expression.get()) == 1:
expression.set("")
if len(expression.get()) < 30:
expression.set(expression.get() + "4")
# num 5
def five(event=""):
if expression.get().startswith("0") and len(expression.get()) == 1:
expression.set("")
if len(expression.get()) < 30:
expression.set(expression.get() + "5")
# num 6
def six(event=""):
if expression.get().startswith("0") and len(expression.get()) == 1:
expression.set("")
if len(expression.get()) < 30:
expression.set(expression.get() + "6")
# num 7
def seven(event=""):
if expression.get().startswith("0") and len(expression.get()) == 1:
expression.set("")
if len(expression.get()) < 30:
expression.set(expression.get() + "7")
# num 8
def eight(event=""):
if expression.get().startswith("0") and len(expression.get()) == 1:
expression.set("")
if len(expression.get()) < 30:
expression.set(expression.get() + "8")
# num 9
def nine(event=""):
if expression.get().startswith("0") and len(expression.get()) == 1:
expression.set("")
if len(expression.get()) < 30:
expression.set(expression.get() + "9")
# add func
def add(event=""):
global full_stop
if len(expression.get()) < 30 and not expression.get().endswith("."):
if expression.get().endswith("+"):
expression.set(expression.get()[:-1] + "+")
elif expression.get().endswith("-"):
expression.set(expression.get()[:-1] + "+")
elif expression.get().endswith("x"):
expression.set(expression.get()[:-1] + "+")
elif expression.get().endswith("÷"):
expression.set(expression.get()[:-1] + "+")
elif expression.get().endswith("%"):
expression.set(expression.get()[:-1] + "+")
elif expression.get().endswith("1/x"):
expression.set(expression.get()[:-1] + "+")
else:
expression.set(expression.get() + "+")
full_stop = 1
# subtract func
def subtract(event=""):
global full_stop
if len(expression.get()) < 30 and not expression.get().endswith("."):
if expression.get().endswith("+"):
expression.set(expression.get()[:-1] + "-")
elif expression.get().endswith("-"):
expression.set(expression.get()[:-1] + "-")
elif expression.get().endswith("x"):
expression.set(expression.get()[:-1] + "-")
elif expression.get().endswith("÷"):
expression.set(expression.get()[:-1] + "-")
elif expression.get().endswith("%"):
expression.set(expression.get()[:-1] + "-")
elif expression.get().endswith("1/x"):
expression.set(expression.get()[:-1] + "-")
else:
expression.set(expression.get() + "-")
full_stop = 1
# multiply fuc
def multiply(event=""):
global full_stop
if len(expression.get()) < 30 and not expression.get().endswith("."):
if expression.get().endswith("+"):
expression.set(expression.get()[:-1] + "x")
elif expression.get().endswith("-"):
expression.set(expression.get()[:-1] + "x")
elif expression.get().endswith("x"):
expression.set(expression.get()[:-1] + "x")
elif expression.get().endswith("÷"):
expression.set(expression.get()[:-1] + "x")
elif expression.get().endswith("%"):
expression.set(expression.get()[:-1] + "x")
elif expression.get().endswith("1/x"):
expression.set(expression.get()[:-1] + "x")
else:
expression.set(expression.get() + "x")
full_stop = 1
def percent(event=""):
global full_stop
if len(expression.get()) < 30 and not expression.get().endswith("."):
if expression.get().endswith("+"):
expression.set(expression.get()[:-1] + "%")
elif expression.get().endswith("-"):
expression.set(expression.get()[:-1] + "%")
elif expression.get().endswith("x"):
expression.set(expression.get()[:-1] + "%")
elif expression.get().endswith("÷"):
expression.set(expression.get()[:-1] + "%")
elif expression.get().endswith("%"):
expression.set(expression.get()[:-1] + "%")
elif expression.get().endswith("1/x"):
expression.set(expression.get()[:-1] + "%")
else:
expression.set(int(expression.get())/100)
full_stop = 1
# divide func
def divide(event=""):
global full_stop
if len(expression.get()) < 30 and not expression.get().endswith("."):
if expression.get().endswith("+"):
expression.set(expression.get()[:-1] + "÷")
elif expression.get().endswith("-"):
expression.set(expression.get()[:-1] + "÷")
elif expression.get().endswith("x"):
expression.set(expression.get()[:-1] + "÷")
elif expression.get().endswith("÷"):
expression.set(expression.get()[:-1] + "÷")
elif expression.get().endswith("%"):
expression.set(expression.get()[:-1] + "÷")
elif expression.get().endswith("1/x"):
expression.set(expression.get()[:-1] + "÷")
else:
expression.set(expression.get() + "÷")
full_stop = 1
def over(event=""):
global full_stop
if len(expression.get()) < 30 and not expression.get().endswith("."):
if expression.get().endswith("+"):
expression.set(expression.get()[:-1] + "1/x")
elif expression.get().endswith("-"):
expression.set(expression.get()[:-1] + "1/x")
elif expression.get().endswith("x"):
expression.set(expression.get()[:-1] + "1/x")
elif expression.get().endswith("÷"):
expression.set(expression.get()[:-1] + "1/x")
elif expression.get().endswith("%"):
expression.set(expression.get()[:-1] + "1/x")
elif expression.get().endswith("1/x"):
expression.set(expression.get()[:-1] + "1/x")
else:
expression.set(1/int(expression.get()))
full_stop = 1
def power(event=""):
global full_stop
if len(expression.get()) < 30 and not expression.get().endswith("."):
if expression.get().endswith("+"):
expression.set(expression.get()[:-1] + "x²")
elif expression.get().endswith("-"):
expression.set(expression.get()[:-1] + "x²")
elif expression.get().endswith("x"):
expression.set(expression.get()[:-1] + "x²")
elif expression.get().endswith("÷"):
expression.set(expression.get()[:-1] + "x²")
elif expression.get().endswith("%"):
expression.set(expression.get()[:-1] + "x²")
elif expression.get().endswith("1/x"):
expression.set(expression.get()[:-1] + "x²")
elif expression.get().endswith("x²"):
expression.set(expression.get()[:-1] + "x²")
else:
expression.set(math.pow(int(expression.get()),2))
full_stop = 1
def sqr(event=""):
global full_stop
if len(expression.get()) < 30 and not expression.get().endswith("."):
if expression.get().endswith("+"):
expression.set(expression.get()[:-1] + "√x")
elif expression.get().endswith("-"):
expression.set(expression.get()[:-1] + "√x")
elif expression.get().endswith("x"):
expression.set(expression.get()[:-1] + "√x")
elif expression.get().endswith("÷"):
expression.set(expression.get()[:-1] + "√x")
elif expression.get().endswith("%"):
expression.set(expression.get()[:-1] + "√x")
elif expression.get().endswith("1/x"):
expression.set(expression.get()[:-1] + "√x")
elif expression.get().endswith("x²"):
expression.set(expression.get()[:-1] + "√x")
elif expression.get().endswith("√x"):
expression.set(expression.get()[:-1] + "√x")
else:
expression.set(math.sqrt(int(expression.get())))
full_stop = 1
def point(event=""):
global full_stop
if len(expression.get()) < 30 and full_stop == 1:
if not expression.get().endswith(("+","-","x","%","÷","1/x","x²")):
expression.set(expression.get() + ".")
full_stop = 0
def reverse():
if not expression.get().startswith("-") and not expression.get().startswith("0") and len(expression.get()) < 30:
expression.set("-" + expression.get())
elif expression.get().startswith("-"):
expression.set(expression.get()[1:])
def delete(event=""):
expression.set(expression.get()[:-1])
if expression.get() == "":
expression.set("0")
def reset(event=""):
global for_calculation
expression.set("0")
for_calculation = None
calculated.set("")
# THIS FUNCTION WILL CALCULATE THE RESULT OF THE EXPRESSION
def calculate(event=""):
global for_calculation
for_calculation = expression.get().replace("x","*").replace("÷","/")
calculated.set(eval(for_calculation))
if str(calculated.get()[int(len(calculated.get()) - 2):]) == ".0":
calculated.set(calculated.get()[:-2])
expression.set("0")
root = Tk()
root.title("CALCULATOR")
root.geometry("500x500")
root.resizable(0,0)
root.configure(bg="#D9D9D9")
expression = StringVar(root,"0")
calculated = StringVar(root)
expression_txt = Entry(root,textvariable=expression,justify=RIGHT,selectbackground="#D9D9D9",font="Comic-sens 15 bold",selectforeground="#000000",readonlybackground="#D9D9D9",state="readonly")
expression_txt.pack(pady=5,anchor=N,padx=2,fill=X)
calculated_lbl = Label(root,textvariable=calculated,anchor=E,bg="#D9D9D9",font="Comic-sens 20 bold")
calculated_lbl.pack(pady=5,padx=6,fill=X)
frame1 = Frame(root,bg="#D9D9D9")
btn = button(frame1,"Calibri 15","#EEEEEE",10)
btn.config(command=percent)
btn.pack(side=LEFT,padx=1,pady=1,fill=BOTH)
btn = button(frame1,"CE",10)
btn.config(command=reset)
btn.pack(side=LEFT,fill=BOTH)
btn = button(frame1,"C",10)
btn.config(command=delete)
btn.pack(side=LEFT,fill=BOTH)
btn= button(frame1,"<-",fill=BOTH)
frame1.pack(side=TOP,anchor=NW,padx=5,fill=BOTH)
frame2 = Frame(root,bg="#D9D9D9")
btn = button(frame2,10)
btn.config(command=over)
btn.pack(side=LEFT,fill=BOTH)
btn = button(frame2,"x²",10)
btn.config(command=power)
btn.pack(side=LEFT,"√x",10)
btn.config(command=sqr)
btn.pack(side=LEFT,10)
btn.config(command=divide)
btn.pack(side=LEFT,fill=BOTH)
frame2.pack(side=TOP,fill=BOTH)
frame3 = Frame(root,bg="#D9D9D9")
btn = button(frame3,"7","Calibri 15 bold","#FFFFFF",10)
btn.config(command=seven)
btn.pack(side=LEFT,fill=BOTH)
btn = button(frame3,"8",10)
btn.config(command=eight)
btn.pack(side=LEFT,"9",10)
btn.config(command=nine)
btn.pack(side=LEFT,10)
btn.config(command=multiply)
btn.pack(side=LEFT,fill=BOTH)
frame3.pack(side=TOP,fill=BOTH)
frame4 = Frame(root,bg="#D9D9D9")
btn = button(frame4,"4",10)
btn.config(command=four)
btn.pack(side=LEFT,fill=BOTH)
btn = button(frame4,"5",10)
btn.config(command=five)
btn.pack(side=LEFT,"6",10)
btn.config(command=six)
btn.pack(side=LEFT,10)
btn.config(command=subtract)
btn.pack(side=LEFT,fill=BOTH)
frame4.pack(side=TOP,fill=BOTH)
frame5 = Frame(root,bg="#D9D9D9")
btn = button(frame5,"1",10)
btn.config(command=one)
btn.pack(side=LEFT,fill=BOTH)
btn = button(frame5,"2",10)
btn.config(command=two)
btn.pack(side=LEFT,"3",10)
btn.config(command=three)
btn.pack(side=LEFT,"+",10)
btn.config(command=add)
btn.pack(side=LEFT,fill=BOTH)
frame5.pack(side=TOP,fill=BOTH)
frame6 = Frame(root,bg="#D9D9D9")
btn = button(frame6,"±",10)
btn.config(command=reverse)
btn.pack(side=LEFT,fill=BOTH)
btn = button(frame6,"0",10)
btn.config(command=zero)
btn.pack(side=LEFT,".",10)
btn.config(command=point)
btn.pack(side=LEFT,"=","#D9D9D9",10)
btn.config(command=calculate)
btn.pack(side=LEFT,fill=BOTH)
frame6.pack(side=TOP,fill=BOTH)
root.bind('0',zero)
root.bind('1',one)
root.bind('2',two)
root.bind('3',three)
root.bind('4',four)
root.bind('5',five)
root.bind('6',six)
root.bind('7',seven)
root.bind('8',eight)
root.bind('9',nine)
root.bind('+',add)
root.bind('-',subtract)
root.bind('*',multiply)
root.bind('/',divide)
root.bind('.',point)
root.bind('%',percent)
root.bind("1/x",over)
root.bind('<BackSpace>',delete)
root.bind('<Delete>',reset)
root.bind('<Return>',calculate)
root.mainloop()
我一直在用 Tkinter 为计算器做一个 python 应用程序。我想知道如何访问按钮属性,例如它们的大小、高度、宽度等,但我试图避免使用 lambda,以便我慢慢学习。
解决方法
您的问题是关于使用内存的函数,因此您需要为记忆值实现存储:
full_stop = 1
for_calculation = None
memory = None
- 按下 M+ 时,您将操作的当前项(“可见”值)添加到内存中(或者用新值替换初始的 None)。
- 当按下 M- 时,您从内存中减去当前术语(或用负数替换初始的 None)。
- 使用 MR,您可以回忆记忆,这意味着您将当前术语替换为 记忆值。
- 使用 MC,您可以清除内存,将其当前值替换为 None。
MU 键有点复杂,这里有一个 link 解释它的作用。
我不确定,但您当前的实现中可能缺少存储当前术语(“可见”值)的变量。在这种情况下,您应该添加一个以避免每次需要时都从整个表达式中提取该术语。
最后,您可以通过使可能的内容通用来缩短代码,例如:
def num(stringNumber,even=""):
if expression.get().startswith("0") and len(expression.get()) == 1:
expression.set("")
if len(expression.get()) < 30:
expression.set(expression.get() + stringNumber)
def zero(even=""): num("0",even)
def one(even=""): num("1",even)
def two(even=""): num("2",even)
#and so on
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。