【发布时间】: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