我需要从一列中提取一个数字
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 )
问题是标签总是空的,即使我按下按钮并调用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中使用} 和The Variable Classes可能是一个好的开始
textvariable
可能很方便,但它需要考虑一些Tcl/Tk样式而不是Python样式。你可能想读一下,我不知道最好的文档在哪里,但是旧书中的^{无论如何,
textvariable
绑定必须引用Tcl变量,就像StringVar
。在使用textvariable=cantidad1
创建Label
之前,您需要执行以下操作:而不是这样:
…你必须这样做:
您要做的是更改名称
cantidad1
以引用新结果,但您需要做的是让它引用StringVar
,并更改StringVar
的值,这样Tk
就可以看到它并更新标签当我们这样做的时候,我想你实际上想要的是
cursor.fetchone()[0]
;否则,您将尝试使用一行(可能是list
或其他序列,而不是字符串)最后,您可以在这里使用
IntVar
。这将允许您将它初始化为0
,而不是'0'
,但是您当然必须将它初始化为set
,而不仅仅是spam
,并且您可能需要一些错误处理来处理数据库返回Null时发生的情况如果所有这些对您来说都是希腊语(或者更糟的是,Tcl),那么另一个选择就是不使用Tk变量:
注意,这里的区别是我设置了初始值
text
,而不是设置textvariable
因此,每次获取新数据时,都必须手动更新(re-
config
)标签的文本,如下所示:这是一个不太惯用的Tk代码,也可以说是不太惯用的Tkinter代码,但是它更像python,所以对您来说读/调试/写可能更容易(请注意,第一行正是您本能地编写的,这与您的原始设计是错误的,因此您的问题,但与显式更新设计是正确的。)
---
代码中还有其他问题我还没有解决。例如,小部件上的
grid
方法不返回小部件,而是返回None
。你这样做是为了ref
,但不是为了cantidad
。您的原始代码实际上从未引用过cantidad
,所以这不是问题,但是如果您(例如)切换到使用手动更新而不是自动变量,那么在None
上调用configure
会遇到一个令人困惑的异常相关问题 更多 >
编程相关推荐