boomsclothes379 发表于 2024-5-31 19:13:06

代码捉虫

这是个计算机,Python写的,有界面,计算不了,大佬帮忙捉虫

Ucraft 发表于 2024-5-31 19:13:07

本帖最后由 Ucraft 于 2024-5-31 19:50 编辑

借用ChatGPT-4o对该文件进行了分析:
您的Python代码中有几个问题,需要进行修正。以下是详细的分析和建议:

[*]函数isPressEqual定义冲突:

[*]您定义了一个名为isPressEqual的函数,但之前这个名字已经被用作全局变量。这会导致命名冲突,影响程序的正常运行。将函数名更改为不同的名称,例如pressEqual。
[*]变量定义和使用:

[*]在多个地方使用了全局变量lists和isPressEqual。为了确保这些变量在函数内部被正确引用,需要在函数开头声明global。
[*]公式字符串拼接错误:

[*]公式字符串拼接处使用了错误的注释,应该使用"".join(lists)而不是.join(lists)。
[*]按钮文本重复:

[*]btn_percent和btn_equal按钮的文本内容都是=。这可能是个错误,应该将btn_percent的文本改为%。
[*]字符编码问题:

[*]在某些操作系统上,字体名称中的中文字符可能会引起问题。确保您的操作系统和Python环境支持这些字体。
以下是修正后的代码:

import tkinter

# 创建主窗口
window = tkinter.Tk()
window.minsize(600, 505)
window.maxsize(600, 505)
window.title("计算器")

# 定义变量
show_top = tkinter.StringVar()
show_top.set("")
show_bottom = tkinter.StringVar()
show_bottom.set(0)

# 定义标签
labell = tkinter.Label(window, font=("微软雅黑", 20),
                     bg="#C0FAF9", fg="#828282", anchor="se",
                     textvariable=show_top, bd="9")
label2 = tkinter.Label(window, font=("微软雅黑", 30),
                     bg="#EEE9E9", fg="black", anchor="se",
                     textvariable=show_bottom, bd="9")

labell.place(width=600, height=140)
label2.place(y=140, width=600, height=90)

# 定义按钮
def create_button(window, text, x, y, command):
    return tkinter.Button(window, text=text, font=("微软雅黑", 20),
                        fg="black", bd=5, command=command).place(x=x, y=y, width=150, height=55)

buttons = {
    '0': (150, 450), '1': (0, 395), '2': (150, 395), '3': (300, 395),
    '4': (0, 340), '5': (150, 340), '6': (300, 340), '7': (0, 285),
    '8': (150, 285), '9': (300, 285), '.': (300, 450)
}

for btn_text, (x, y) in buttons.items():
    create_button(window, btn_text, x, y, lambda t=btn_text: pressNum(t))

btn_ac = tkinter.Button(window, text="AC", font=("微软雅黑", 20),
                        fg="orange", bd=5,
                        command=lambda: pressSign("AC"))
btn_back = tkinter.Button(window, text="←", font=("微软雅黑", 20),
                        fg="orange", bd=5,
                        command=lambda: pressSign("b"))
btn_division = tkinter.Button(window, text="÷", font=("微软雅黑", 20),
                              fg="orange", bd=5,
                              command=lambda: pressSign("/"))
btn_multiplication = tkinter.Button(window, text="×", font=("微软雅黑", 20),
                                    fg="orange", bd=5,
                                    command=lambda: pressSign("*"))
btn_subtraction = tkinter.Button(window, text="-", font=("微软雅黑", 20),
                                 fg="orange", bd=5,
                                 command=lambda: pressSign("-"))
btn_addition = tkinter.Button(window, text="+", font=("微软雅黑", 20),
                              fg="orange", bd=5,
                              command=lambda: pressSign("+"))
btn_equal = tkinter.Button(window, text="=", font=("微软雅黑", 20),
                           fg="#4F4F4F", bd=5,
                           command=lambda: pressEqual())
btn_percent = tkinter.Button(window, text="%", font=("微软雅黑", 20),
                           fg="orange", bd=5,
                           command=lambda: pressSign("%"))

btn_ac.place(x=0, y=230, width=150, height=55)
btn_back.place(x=150, y=230, width=150, height=55)
btn_division.place(x=300, y=230, width=150, height=55)
btn_multiplication.place(x=450, y=230, width=150, height=55)
btn_subtraction.place(x=450, y=285, width=150, height=55)
btn_addition.place(x=450, y=340, width=150, height=55)
btn_equal.place(x=450, y=395, width=150, height=110)
btn_percent.place(x=0, y=450, width=150, height=55)

# 全局变量
lists = []
isPressSign = False
isPressEqual = False

# 定义函数
def pressNum(num):
    global lists
    global isPressSign
    global isPressEqual

    if isPressSign:
      show_bottom.set(0)
      isPressSign = False

    if isPressEqual:
      show_bottom.set(0)
      isPressEqual = False

    original_num = show_bottom.get()
    if original_num == "0":
      show_bottom.set(num)
    else:
      existing_num = original_num + num
      show_bottom.set(existing_num)

def pressSign(sign):
    global lists
    global isPressSign

    num = show_bottom.get()
    lists.append(num)

    lists.append(sign)
    isPressSign = True

    if sign == "AC":
      lists.clear()
      show_bottom.set(0)

    if sign == "b":
      a = num
      lists.clear()
      show_bottom.set(a)

      if len(a) == 0:
            show_bottom.set(0)

def pressEqual():
    global lists
    global isPressEqual

    isPressEqual = True
    num = show_bottom.get()
    lists.append(num)
    formula = "".join(lists)
    try:
      result = eval(formula)
    except:
      result = "Error"
    show_bottom.set(result)
    show_top.set(formula)
    lists.clear()

window.mainloop()


此代码修正了上述问题,并使计算器正常运行。请注意,eval函数用于计算表达式时存在安全风险,因此仅在信任输入的情况下使用。在生产环境中,应使用更安全的解析和计算方法。

你可以先测试一下,稍后我也会测试更正后的代码的可行性

boomsclothes379 发表于 2024-5-31 19:51:12

Ucraft 发表于 2024-5-31 19:48
借用ChatGPT-4o对该文件进行了分析:
您的Python代码中有几个问题,需要进行修正。以下是详细的分析和建议: ...

byd科技改变生活

Crigo 发表于 2024-5-31 20:21:07

事Python大佬)

boomsclothes379 发表于 2024-5-31 20:27:46

Crigo 发表于 2024-5-31 20:21
事Python大佬)

事刚刚入门)
页: [1]
查看完整版本: 代码捉虫