gpt4 book ai didi

Python Tkinter 计算器不会计算输入小部件中的文本

转载 作者:行者123 更新时间:2023-12-01 05:47:07 26 4
gpt4 key购买 nike

我正在尝试使用 tkinter 制作一个简单的计算器应用程序,但每次运行下面的代码时我都会收到一条错误消息

Traceback (most recent call last):
File "C:\Python33\Lib\site-packages\pythonwin\pywin\framework\scriptutils.py", line 326, in RunScript
exec(codeObject, __main__.__dict__)
File "C:\Users\csp\Python\Calculator App.py", line 17, in <module>
solved = eval(expression)
File "<string>", line 0

^
SyntaxError: unexpected EOF while parsing

代码:

from tkinter import *
tk = Tk()
tk.title('Calculator')
inp = Entry(tk,text="Enter Expression Here",width=20)
inp.pack()
exit = False
def exitbtn():
global exit
exit = True
return exit
btn = Button(tk,text="Quit?",command=exitbtn)
btn.pack
canvas = Canvas(tk,width=200,height=200)
canvas.pack()
while not exit:
expression = inp.get()
solved = eval(expression)
canvas.create_text(100,100,text=expression,font=('Times', 15))
canvas.create_text(100,150,text=solved,font=('Times', 15))
if exit == True:
break
tk.destroy()

我对Python真的很陌生,不明白为什么“solved = eval(expression)”行不起作用。请帮忙

最佳答案

所以,原因是eval不起作用是因为当您第一次启动程序时, expression只是一个空字符串。如果您转到 python shell,然后输入 eval('') ,您会看到出现相同的错误。

一种解决方案是检查是否 expression是否为空字符串,然后执行如下操作:

expression = inp.get()
if expression != '':
solved = eval(expression)
else:
solved = '?'

但是,即使应用此修复程序后,您的程序也将因不相关的原因而无法运行。主要原因是你从来不打电话 tk.mainloop() (或者不管它叫什么),所以窗口不会显示。

这是因为你的while循环——您想要做的是不断检查输入字段,并在运行 eval 后每当获得新输入时更新 Canvas 。 。

但是,GUI 程序通常不会以这种方式工作,并且在编写它们时需要不同的思维方式和方法。您不必编写循环来检查和更新程序状态,而是编写每当程序状态发生变化(称为事件)时就会自动调用的函数。一开始会感觉有点倒退,但随着时间的推移,它将有助于使您的代码更干净且更易于管理。

实际上,您已经在程序的一部分中执行了此操作 - 使用 exitbtn功能。现在,您只需转换您的 while循环进入类似的函数并将其绑定(bind)到 Entry对象。

编辑:

下面是一些可以实现您想要的功能的示例代码:

import sys
from tkinter import *


# Create the GUI
tk = Tk()
tk.title('Calculator')

inp = Entry(tk, text="Enter Expression Here", width=20)
inp.pack()

btn = Button(tk, text="Quit?")
btn.pack()

canvas = Canvas(tk, width=200, height=200)
canvas.pack()


# Create callback functions
def end_program(event):
'''Destroys the window and ends the program without needing
to use global variables or a while loop'''
tk.destroy()
sys.exit() # Automatically ends any Python program

def update_canvas(event):
'''Gets the input, tries to eval it, and displays it to the canvas'''
expression = inp.get()
try:
solved = eval(expression)
except SyntaxError:
# The expression wasn't valid, (for example, try typing in "2 +")
# so I defaulted to something else.
solved = '??'

canvas.delete('all') # remove old text to avoid overlapping
canvas.create_text(100, 100, text=expression,font=('Times', 15))
canvas.create_text(100, 150, text=solved,font=('Times', 15))


# Bind callbacks to GUI elements
btn.bind('<Button-1>', end_program)
inp.bind('<KeyRelease>', update_canvas)


# Run the program
tk.mainloop()

一些注意事项:

  • 我移动了您的代码以进行检查 inp并将 Canvas 写入 update_canvas函数,并摆脱了 while循环。
  • update_canvas每当有人在输入inp时松开按键时,函数就会自动被调用对象(<KeyRelease> 事件)。
    • 这可能会导致一些问题 - 这将意味着您的 update_canvas当用户在计算器中输入文本时,将调用该函数。例如,如果用户输入 2 + 2 * 会怎样? ?它不是一个完整的表达式,因此无法被 eval 解析.
    • 为了解决这个问题,我刚刚包装了 eval在 try-except 中,以防止任何错误的输入搞乱程序。
  • 同样,end_program每当有人左键单击 btn 时就会被调用对象(<Button-1> 事件)。

关于Python Tkinter 计算器不会计算输入小部件中的文本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15705984/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com