我正在尝试用GUI制作一个简单的计算器。所以到目前为止我所拥有的是按钮和输入框设置,但我不知道如何在它们上显示文本。所以目前,“等式”等于0.我想要做的是当用户按下相等按钮时,它会将解决的等式显示在名为inputbox的Entry中。如何将等式显示回输入框?
import sys
from Tkinter import *
#modules
equation = '0'
def Entrybox():
theinput = inputbox.get()
if type(theinput) is float:
pass
elif type(theinput) is int:
equation += theinput
else:
return 'Numbers Only'
def bp1():
equation = equation + '1'
def bp2():
equation = equation + '2'
def bp3():
equation = equation + '3'
def bp4():
equation = equation + '4'
def bp5():
equation = equation + '5'
def bp6():
equation = equation + '6'
def bp7():
equation = equation + '7'
def bp8():
equation = equation + '8'
def bp9():
equation = equation + '9'
def bp0():
equation = equation + '0'
def bpplus():
equation = equation + '+'
def bpmin():
equation = equation + '-'
def bpmulti():
equation = equation + '*'
def bpdiv():
equation = equation + '/'
def bpequal():
eval(equation)
return
def bpclear():
equation = equation - equation
gui = Tk()
inputvar = StringVar()
#gui Size
gui.geometry('360x400')
#title
gui.title("A Lucas Calculator")
#The input box
inputbox = Entry(gui, textvariable = inputvar, bd = 10,width = 34)
inputbox.place(x = 40, y = 50)
#buttons
number3 = Button(gui, text = '3',font = 15,width = 4,command = bp3)
number3.place(x = 200,y = 260)
number2 = Button(gui, text = '2',font = 15,width = 4,command = bp2)
number2.place(x = 120,y = 260)
number1 = Button(gui, text = '1',font = 15,width = 4, command = bp1)
number1.place(x = 40,y = 260)
number6 = Button(gui, text = '6',font = 15,width = 4,command = bp6)
number6.place(x = 200,y = 200)
number5 = Button(gui, text = '5',font = 15,width = 4,command = bp5)
number5.place(x = 120 ,y = 200)
number4 = Button(gui, text = '4',font = 15,width = 4,command = bp4)
number4.place(x = 40, y = 200)
number9 = Button(gui, text = '9',font = 15,width = 4, command = bp9)
number9.place(x = 200,y = 140)
number8 = Button(gui, text = '8',font = 15,width = 4,command = bp8)
number8.place(x = 120,y = 140)
number7 = Button(gui, text = '7',font = 15,width = 4,command = bp7)
number7.place(x = 40,y = 140)
number0 = Button(gui, text = "0",font = 15,width = 4,command = bp0)
number0.place(x = 120,y = 318)
signplus = Button(gui, text = "+", font = 14, width = 3,bg = 'red', fg = 'white',command = bpplus)
signplus.place(x = 280,y = 140)
signmin = Button(gui, text = "-", font = 14, width = 3,command = bpmin)
signmin.place(x = 280,y = 200)
signmulti = Button(gui, text = "X", font = 14, width = 3,command = bpmulti)
signmulti.place(x = 280,y = 260)
signdiv = Button(gui, text = "/", font = 14, width = 3,command = bpdiv)
signdiv.place(x = 280,y = 318)
signequal = Button(gui, text = "=", font = 15, width = 4,bg = 'blue',fg = 'white',command = bpequal)
signequal.place(x = 200, y = 318)
clearbutton = Button(gui, text = "Clear", font = 14, width = 4,bg = "green", fg = "white",command = bpclear)
clearbutton.place(x= 40, y = 318)
gui.mainloop()
答案 0 :(得分:1)
由于您已将textvariable
附加到Entry
,因此最简单的方法是使用它:
inputvar.set('numbers only')
Tkinter书中The Variable Classes的教程更详细地解释了......但实际上没有更多要解释的内容。
(我假设inputvar
在您未向我们展示的代码中的某个地方正确创建为Tkinter.StringVar()
,并且您将其保存在某处,如实例变量,以后使用。如果没有,显然你需要解决这些问题。)
如果不使用textvariable
,请参阅Entry文档,了解有关其他方法的详细信息。
不幸的是,你编写的代码函数太过破碎而无法实现这一目标。
首先,您定义的Entrybox
函数永远不会被调用,因此您在该函数中执行的任何操作都不会产生任何影响。我不确定你在哪里想要它被调用,所以我无法为你解决这个问题。
并且 实际上无法调用此类调用,因为所有事件处理函数都会在您单击它们时引发异常,因为它们看起来都像这样:
equation = equation + '1'
每当你在一个函数中赋值变量时,这意味着它是一个局部变量,除非你另有说明。但是,在此分配完成之前,您 已一个名为equation
的局部变量 - 但您尝试使用equation + '1'
作为值。所以,你会得到UnboundLocalError: local variable 'equation' referenced before assignment
。
您真的不应该摆在首位使用全局变量(一个GUI框架的范式使用情况的一类,这就是为什么所有的不平凡的Tkinter例子都写这样一个,你应该按照这些例子)。如果你真的想使用全局变量,你可以,但是你需要明确,如下所示:
def bp1():
global equation
equation = equation + '1'
与此同时,一旦你弄清楚调用Entrybox
的位置和方式,就会出现一些问题:
def Entrybox():
theinput = inputbox.get()
if type(theinput) is float:
pass
elif type(theinput) is int:
equation += theinput
else:
return 'Numbers Only'
如果您有inputvar
,那么您确实应该使用inputvar.get()
,而不是直接使用Entry
。如上所述,它不会导致任何问题,但它会使您的代码更难以遵循。
更严重的是,Entry.get
始终返回一个字符串*,以便theinput
永远不会成为int或float。所以,你的比较毫无意义。即使他们确实有意义,也不是在Python中使用isinstance(theinput, int)
来检查类型的方法,而不是type(theinput)
。如果你真的需要比较类型(这是非常罕见的),你应该使用==
,而不是is
。一般来说,如果你不知道你想要哪一个,你想要==
;仅对特定的惯用案例(如is
)使用is None
,或者当您要检查两个表达式是否命名完全相同的对象时,不仅仅是它们具有相同的值。
无论如何,如果你想检查inputvar
中的字符串是否是可以转换为int的字符串,那么这样做的方法是:
try:
value = int(theinput)
equation += theinput
except:
return 'Numbers Only'
当然,所有相同的事情都适用于float
。
一旦你解决了所有这些问题,以及其他任何我没有粗略看过的问题,那么你可以将return 'Numbers Only'
更改为inputvar.set('Numbers Only')
,然后你'完了。
然而,对于整个事情来说,有一个更好,更好的设计。只需让每个按钮在条目的末尾插入一个字符,然后使用条目的内容(可以从inputvar
获得)作为等式,并使用Entry validation or StringVar tracing来处理非法的密钥条目。该博客文章中有一个示例,上面链接的官方Entry
文档中有另一个示例。
*实际上,它可能是一种字符串 - str
或unicode
- 但让我们忽略它。