如何在Tkinter上的Entry上显示文字?

时间:2013-12-31 20:59:01

标签: python user-interface tkinter

我正在尝试用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()

1 个答案:

答案 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文档中有另一个示例。


*实际上,它可能是一种字符串 - strunicode - 但让我们忽略它。