【问题标题】:Tkinter not showing DB number in LabelTkinter 未在标签中显示 DB 编号
【发布时间】:2018-03-08 23:48:47
【问题描述】:

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

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 空白"

【问题讨论】:

    标签: python tkinter label


    【解决方案1】:

    在 Tkinter 中使用 textvariable 可能很方便,但它需要在 Tcl/Tk 风格而不是 Python 风格中进行一些思考。您可能想阅读它我不确定最好的文档在哪里,但旧书中的EntryThe 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 初始化为int(spam) 而不仅仅是spam,您可能需要一些错误处理来处理如果数据库返回 Null,就会发生这种情况。


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

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

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

    所以现在,每次获取新数据时,都必须手动更新(重新config)标签的文本,如下所示:

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

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

    ——

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

    【讨论】:

    • 我对此完全陌生。 Cantidad1 应该是一个简单的数字。 cantidad1.set(...) 是如何使用的?
    • @GastonRaboy 我重写了答案以进一步解释,但您可能会想找到一个关于 Tkinter 变量的好教程。我在 effbot TKinter 书中链接的部分应该会有所帮助,但那本书已经过时了——为 Python 2.3 左右编写的,并且引用了不再存在的 Tcl/Tk 文档,等等。希望有更好的学习资源,但我不知道它是什么。
    • @GastonRaboy:或者,将其保留为“简单数字”,不要使用textvariable;相反,编写代码以在每次获取新数据时显式更新标签的文本。
    • 在您的最终代码示例中,cantidad 将设置为 None
    • @Nae:那么您认为现在的答案还可以吗?同时,如果你仍然认为应该有一个不同的答案来说服他不要使用textvariable 并跳入替代方案,你应该写它。
    猜你喜欢
    • 1970-01-01
    • 2017-03-12
    • 2022-01-10
    • 2014-07-31
    • 1970-01-01
    • 2021-11-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多