【用Python编写一个计算器】

import tkinter as tk
from functools import partial

def create_calculator_window():
    window = tk.Tk()
    window.geometry("280x400")
    window.title("计算器Python_V1.0")

    # 在窗口中创建一个Label标签作为计算器的显示屏
    display = tk.Label(window, text="", font=("Helvetica", 16), height=2, width=20,background="lightyellow")
    display.grid(row=0, column=0, columnspan=4, pady=10)
    
    def on_keypress(key):
        # print(int(key))
        if key == "AC" or key=="\x1b":
            display["text"] = ""
        elif key == "←" or key== '\x08':
            display["text"] = display["text"][:-1]
        elif key == "=" or key== '\r':
            try:
                expression = display["text"]
                expression = expression.replace("÷", "/")
                expression = expression.replace("x", "*")
                #使用eval()函数计算表达式的结果
                result = eval(expression)
                if isinstance(result, float) and result.is_integer():
                    result = int(result)
                display["text"] = str(result)
            except:
                display["text"] = "Error"
        else:
            if "=" in display["text"]:
                display["text"] = ""
            display["text"] += key
    keys = [
        ("AC", on_keypress),
        ("(", on_keypress),
        (")", on_keypress),
        ("÷", on_keypress),
        ("7", on_keypress),
        ("8", on_keypress),
        ("9", on_keypress),
        ("x", on_keypress),
        ("4", on_keypress),
        ("5", on_keypress),
        ("6", on_keypress),
        ("-", on_keypress),
        ("1", on_keypress),
        ("2", on_keypress),
        ("3", on_keypress),
        ("+", on_keypress),
        ("0", on_keypress),
        (".", on_keypress),
        ("←", on_keypress),
        ("=", on_keypress)
    ]
    
    row = 1
    col = 0
    for key, command in keys:
        button = tk.Button(window, text=key, font=("Helvetica", 12), height=2, width=5)
        button.grid(row=row, column=col, padx=5, pady=5)
        button.configure(command=partial(command, key))
        col += 1
        if col > 3:
            col = 0
            row += 1
    
    window.bind("<Key>", lambda event: on_keypress(event.char))
    window.mainloop()

if __name__ == "__main__":
    create_calculator_window()


# 在上面的代码中,我们使用Tk()函数创建了一个名为window的窗口。然后,我们使用geometry()方法设置窗口的大小为300x400像素,并使用title()方法设置窗口的标题为"计算器"。
# 接下来,我们使用Label()函数创建了一个名为display的标签,作为计算器的显示屏。我们设置了标签的文本为空字符串,字体为Helvetica,字号为16,高度为2,宽度为18,并使用grid()方法将标签放置在窗口的第0行、第0列,横跨4列,上下间距为10像素。
# ————————————————
# 在上面的代码中,我们定义了一个名为on_keypress()的函数,接受一个名为key的参数,表示用户按下的按钮。
# 首先,我们检查key的值是否为"AC",如果是,我们将显示屏的文本设置为空字符串,即清零。
# 然后,我们检查key的值是否为"←",如果是,我们将显示屏的文本设置为当前文本的前一个字符。
# 接下来,我们检查key的值是否为"%“,如果是,我们尝试将显示屏上的表达式转换为一个浮点数,并将结果除以100。如果转换和计算过程中没有出现错误,我们将结果转换为字符串并更新显示屏的文本。否则,我们将显示屏的文本设置为"Error”。
# 然后,我们检查key的值是否为"=“,如果是,我们尝试解析并计算显示屏上的表达式。在计算之前,我们使用replace()方法将所有的"÷"替换为”/“,将所有的"x"替换为”*“,以便让Python的eval()函数理解这些操作符。
# 然后,我们使用eval()函数计算表达式的结果,并将结果转换为字符串更新显示屏的文本。如果计算过程中出现任何错误,我们将显示屏的文本设置为"Error”。
# 最后,如果用户按下的是其他按钮(即数字和操作符),我们检查显示屏的文本是否包含"="。如果包含,说明用户正在输入新的表达式,我们将显示屏的文本设置为空字符串。然后,我们将用户的输入字符添加到显示屏的文本末尾。
# ————————————————
# 在上面的代码中,我们创建了一个名为keys的列表,包含了所有按钮的标签和事件处理函数。
# 然后,我们使用for循环遍历keys列表中的每个元素。对于每个元素,我们使用Button()函数创建一个按钮,并设置按钮的文本、字体、高度和宽度。然后,我们使用grid()方法将按钮放置在窗口中的指定位置,并设置上下和左右的间距。
# 接下来,我们使用configure()方法将按钮的command属性设置为要执行的事件处理函数,并使用partial()函数传递按钮的标签作为事件处理函数的参数。
# 最后,我们更新col和row的值,确保按钮的位置正确。
# ————————————————
# 除了通过点击按钮来输入内容之外,我们还希望用户能够使用键盘输入。为了实现这一点,
# 我们使用bind()方法将"<Key>"事件与一个lambda函数关联起来。这个lambda函数将用户按下的字符作为参数,然后调用on_keypress()函数来处理这个字符。
# <KeyPress event send_event=True state=Mod1 keysym=3 keycode=99 char='3' x=1141 y=328>
# <KeyPress event send_event=True state=Mod1|0x40000 keysym=Return keycode=13 char='\r' x=1247 y=898>
# <KeyPress event send_event=True state=Mod1 keysym=BackSpace keycode=8 char='\x08' x=852 y=1033>
# <KeyPress event send_event=True state=Shift|Mod1 keysym=parenleft keycode=57 char='(' x=836 y=673>
# <KeyPress event send_event=True state=Shift|Mod1 keysym=parenright keycode=48 char=')' x=836 y=673>

  • 7
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值