我需要从列
中获取一个数字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"
答案 0 :(得分:1)
在Tkinter中使用textvariable
可能很方便,但它需要考虑Tcl / Tk样式而不是Python样式。您可能想要阅读它我不确定最佳文档的位置,但旧书中的Entry
和The 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}}。