Tkinter未在实验室显示数据库号

2024-10-03 02:36:20 发布

您现在位置:Python中文网/ 问答频道 /正文

我需要从一列中提取一个数字

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“空白屏幕截图”


Tags: fromrefexecuteupdatecolumnselectcursorcommand
1条回答
网友
1楼 · 发布于 2024-10-03 02:36:20

在Tkinter中使用textvariable可能很方便,但它需要考虑一些Tcl/Tk样式而不是Python样式。你可能想读一下,我不知道最好的文档在哪里,但是旧书中的^{}The Variable Classes可能是一个好的开始

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

cantidad1 = StringVar('0')

而不是这样:

cantidad1 = cursor.fetchone()

…你必须这样做:

cantidad1.set(cursor.fetchone())

您要做的是更改名称cantidad1以引用新结果,但您需要做的是让它引用StringVar,并更改StringVar的值,这样Tk就可以看到它并更新标签


当我们这样做的时候,我想你实际上想要的是cursor.fetchone()[0];否则,您将尝试使用一行(可能是list或其他序列,而不是字符串)


最后,您可以在这里使用IntVar。这将允许您将它初始化为0,而不是'0',但是您当然必须将它初始化为set,而不仅仅是spam,并且您可能需要一些错误处理来处理数据库返回Null时发生的情况


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

cantidad = Label(ventana, text='0').grid(row=1, column=3)

注意,这里的区别是我设置了初始值text,而不是设置textvariable

因此,每次获取新数据时,都必须手动更新(re-config)标签的文本,如下所示:

cantidad1 = ... # code that just gets a normal Python string
cantidad.config(text=cantidad1)

这是一个不太惯用的Tk代码,也可以说是不太惯用的Tkinter代码,但是它更像python,所以对您来说读/调试/写可能更容易(请注意,第一行正是您本能地编写的,这与您的原始设计是错误的,因此您的问题,但与显式更新设计是正确的。)

---

代码中还有其他问题我还没有解决。例如,小部件上的grid方法不返回小部件,而是返回None。你这样做是为了ref,但不是为了cantidad。您的原始代码实际上从未引用过cantidad,所以这不是问题,但是如果您(例如)切换到使用手动更新而不是自动变量,那么在None上调用configure会遇到一个令人困惑的异常

相关问题 更多 >