Tkinter未在Label中显示DB编号

时间:2018-03-08 23:48:47

标签: python tkinter label

我需要从列

中获取一个数字
cursor.execute('''SELECT vacas FROM animales''')
cantidad1 = cursor.fetchone()

然后我需要在Tkinter标签中显示这个数字:

cantidad = Label (ventana, textvariable=cantidad1).grid(row=1, column=3)

我有一个刷新按钮,以便更新数据。

ref = Button (ventana, text="Refresh", command=update )

问题是Label总是空白,即使我按下按钮并调用Update():

以下是完整的代码:

cantidad1 = 0 
ventana = Tk()
cursor = db.cursor()

def update():
    cursor.execute('''SELECT vacas FROM animales''')
    cantidad1 = cursor.fetchone()
    print (cantidad1[0]) #The number shown in command is right, but blank in tkinter.




ref = Button (ventana, text="Refresh", command=update )
ref.grid(row=3, column=2)
cantidad = Label (ventana, textvariable=cantidad1).grid(row=1, column=3)


ventana.mainloop()

https://imgur.com/AvsNAuL"截图tkinter blank"

1 个答案:

答案 0 :(得分:1)

在Tkinter中使用textvariable可能很方便,但它需要考虑Tcl / Tk样式而不是Python样式。您可能想要阅读它我不确定最佳文档的位置,但旧书中的EntryThe Variable Classes可能是一个很好的起点。

无论如何,textvariable绑定必须引用Tcl变量,如StringVar。在使用Label创建textvariable=cantidad1之前的某个地方,您需要执行以下操作:

cantidad1 = StringVar('0')

然后,而不是这个:

cantidad1 = cursor.fetchone()

......你必须这样做:

cantidad1.set(cursor.fetchone())

您正在做的是更改名称cantidad1以引用新结果,但您需要要做的是让它引用StringVar并更改StringVar的值,以便Tk可以查看并更新标签。

虽然我们正在努力,但我认为你真的想要cursor.fetchone()[0]之类的东西。否则你试图使用一行(可能是list或其他序列,而不是字符串)。

最后,你可以在这里使用IntVar。这样您就可以将其初始化为0而不是'0',但当然您必须set将其int(spam)改为spam,而不仅仅是cantidad = Label(ventana, text='0').grid(row=1, column=3) ,您可能需要一些错误处理来处理数据库返回Null时发生的情况。

如果所有这些对您来说都是希腊语(或者更糟糕的是Tcl),那么另一种选择就是不使用Tk变量:

text

请注意,这里的区别在于我设置了初始textvariable,而不是设置config

现在,每次提取新数据时,您都必须手动更新(重新cantidad1 = ... # code that just gets a normal Python string cantidad.config(text=cantidad1) )标签的文字,如下所示:

grid

这不是惯用的Tk代码,可以说是较少惯用的Tkinter代码 - 但它更多的是Pythonic,因此您可能更容易阅读/调试/写入。 (请注意,第一行正是您本能地写的,这对您的原始设计是错误的,因此您的问题,但是对于显式更新设计是正确的。)

-

我还没有修复代码中的其他问题。例如,窗口小部件上的None方法不返回窗口小部件,它返回ref。您正在为cantidad执行此操作,但不适用于cantidad。您的原始代码实际上从未引用configure,因此这不是问题,但如果您(例如,切换到使用手动更新而不是自动变量),您将会遇到一个令人困惑的例外情况在None上调用{{1}}。