【问题标题】:Calculator windows 10 but missing MC, M+, M-, MU and MR buttons计算器窗口 10 但缺少 MC、M+、M-、MU 和 MR 按钮
【发布时间】:2020-12-19 03:15:45
【问题描述】:

我实际上不知道这些按钮(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", relief=FLAT,
                       bd=0, state="readonly")
expression_txt.pack(pady=5, anchor=N, padx=2, fill=X)


calculated_lbl = Label(root, textvariable=calculated, anchor=E, bg="#D9D9D9", relief=FLAT, bd=0,
                       font="Comic-sens 20 bold")
calculated_lbl.pack(pady=5, anchor=N, 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", "Calibri 15", "#EEEEEE", 10)
btn.config(command=reset)
btn.pack(side=LEFT, padx=1, pady=1, fill=BOTH)


btn = button(frame1, "C", "Calibri 15", "#EEEEEE", 10)
btn.config(command=delete)
btn.pack(side=LEFT, padx=1, pady=1, fill=BOTH)

btn= button(frame1, "<-", "Calibri 15", "#EEEEEE", 10)
btn.config(command=delete)
btn.pack(side=LEFT, padx=1, pady=1, fill=BOTH)


frame1.pack(side=TOP, anchor=NW, padx=5, fill=BOTH)


frame2 = Frame(root, bg="#D9D9D9")


btn = button(frame2,"1/x","Calibri 15", "#EEEEEE", 10)
btn.config(command=over)
btn.pack(side=LEFT, padx=1, pady=1, fill=BOTH)

btn = button(frame2, "x²","Calibri 15", "#EEEEEE", 10)
btn.config(command=power)
btn.pack(side=LEFT, padx=1, pady=1, fill=BOTH)

btn = button(frame2, "√x","Calibri 15", "#EEEEEE", 10)
btn.config(command=sqr)
btn.pack(side=LEFT, padx=1, pady=1, fill=BOTH)

btn = button(frame2, "÷", "Calibri 15", "#EEEEEE", 10)
btn.config(command=divide)
btn.pack(side=LEFT, padx=1, pady=1, fill=BOTH)

frame2.pack(side=TOP, anchor=NW, padx=5, fill=BOTH)


frame3 = Frame(root, bg="#D9D9D9")

btn = button(frame3, "7", "Calibri 15 bold", "#FFFFFF", 10)
btn.config(command=seven)
btn.pack(side=LEFT, padx=1, pady=1, fill=BOTH)

btn = button(frame3, "8", "Calibri 15 bold", "#FFFFFF", 10)
btn.config(command=eight)
btn.pack(side=LEFT, padx=1, pady=1, fill=BOTH)

btn = button(frame3, "9", "Calibri 15 bold", "#FFFFFF", 10)
btn.config(command=nine)
btn.pack(side=LEFT, padx=1, pady=1, fill=BOTH)

btn = button(frame3, "x", "Calibri 15", "#EEEEEE", 10)
btn.config(command=multiply)
btn.pack(side=LEFT, padx=1, pady=1, fill=BOTH)

frame3.pack(side=TOP, anchor=NW, padx=5, fill=BOTH)


frame4 = Frame(root, bg="#D9D9D9")

btn = button(frame4, "4", "Calibri 15 bold", "#FFFFFF", 10)
btn.config(command=four)
btn.pack(side=LEFT, padx=1, pady=1, fill=BOTH)

btn = button(frame4, "5", "Calibri 15 bold", "#FFFFFF", 10)
btn.config(command=five)
btn.pack(side=LEFT, padx=1, pady=1, fill=BOTH)

btn = button(frame4, "6", "Calibri 15 bold", "#FFFFFF", 10)
btn.config(command=six)
btn.pack(side=LEFT, padx=1, pady=1, fill=BOTH)

btn = button(frame4, "-", "Calibri 15", "#EEEEEE", 10)
btn.config(command=subtract)
btn.pack(side=LEFT, padx=1, pady=1, fill=BOTH)

frame4.pack(side=TOP, anchor=NW, padx=5, fill=BOTH)


frame5 = Frame(root, bg="#D9D9D9")

btn = button(frame5, "1", "Calibri 15 bold", "#FFFFFF", 10)
btn.config(command=one)
btn.pack(side=LEFT, padx=1, pady=1, fill=BOTH)

btn = button(frame5, "2", "Calibri 15 bold", "#FFFFFF", 10)
btn.config(command=two)
btn.pack(side=LEFT, padx=1, pady=1, fill=BOTH)

btn = button(frame5, "3", "Calibri 15 bold", "#FFFFFF", 10)
btn.config(command=three)
btn.pack(side=LEFT, padx=1, pady=1, fill=BOTH)

btn = button(frame5, "+", "Calibri 15", "#EEEEEE", 10)
btn.config(command=add)
btn.pack(side=LEFT, padx=1, pady=1, fill=BOTH)

frame5.pack(side=TOP, anchor=NW, padx=5, fill=BOTH)


frame6 = Frame(root, bg="#D9D9D9")

btn = button(frame6, "±", "Calibri 15", "#EEEEEE", 10)
btn.config(command=reverse)
btn.pack(side=LEFT, padx=1, pady=1, fill=BOTH)

btn = button(frame6, "0", "Calibri 15 bold", "#FFFFFF", 10)
btn.config(command=zero)
btn.pack(side=LEFT, padx=1, pady=1, fill=BOTH)

btn = button(frame6, ".", "Calibri 15", "#EEEEEE", 10)
btn.config(command=point)
btn.pack(side=LEFT, padx=1, pady=1, fill=BOTH)

btn = button(frame6, "=", "Calibri 15 bold", "#D9D9D9", 10)
btn.config(command=calculate)
btn.pack(side=LEFT, padx=1, pady=1, fill=BOTH)

frame6.pack(side=TOP, anchor=NW, padx=5, 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 让我慢慢学习。

【问题讨论】:

  • 搜索cget()
  • 我知道cget() 的工作原理,但我需要知道如何使用这些按钮进行操作
  • 请将其缩减为minimal reproducible example。有很多代码似乎没有必要说明您提出的问题。

标签: python tkinter calculator


【解决方案1】:

您的问题是关于使用内存的函数,因此您需要为记忆值实现存储:

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


    
    

【讨论】:

  • 非常感谢您将尝试缩短所有内容并添加缺少的按钮
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多