我无法更改标签的文本

时间:2015-02-10 16:44:07

标签: python module tkinter

我正在尝试为GUI程序提供代码。我做了一个简单的测试,我无法更改GUI上的文本值,没有错误,没有任何反应。 mainloop Tkinter的某些问题?

serial.py:

import gui
gui.chiplabel.config(text="A.3f V" )

gui.py:

from Tkinter import *
root = Tk()
chiplabel = Label(root, relief=RIDGE,  width = 9 , text ="Unknown",
                  padx=0, pady=0).grid(row = 0,column=5, sticky =W)
root.mainloop()

2 个答案:

答案 0 :(得分:4)

您的代码有两个主要问题。它需要进行重组,并且在布置小部件时会犯一个非常常见的错误。

整理代码

您构建代码的方式,您configure的调用是在mainloop退出后以及小部件被销毁之后发生的。您需要重新组织代码,以便对mainloop的调用是执行的最后一行代码。

在我看来,最好通过使用类和对象来实现,但这并不是绝对必要的。致电mainloop后,您只需要没有任何代码。

布置小部件

问题在于这一行:

chiplabel = Label( root, relief=RIDGE,  width = 9 , text ="Unknown",  padx=0, pady=0).grid(row = 0,column=5, sticky =W)

在python中,当您执行x=y().z()时,x的值为z()。因此,当您执行chiplabel = Label(...).grid(...)时,chiplabel的值为grid(...)。网格始终返回None,因此chiplabel始终为None。因此,您无法重新配置它,因为您丢失了对小部件的引用。

解决方案是创建窗口小部件并分两步布局窗口小部件。

答案 1 :(得分:-1)

这样做的一种方法是在类中创建UI,例如:

import Tkinter as tk  # note don't use wildcard imports

class GUI(tk.Tk):

    def __init__(self):
        tk.Tk.__init__(self)
        self.chiplabel = tk.Label(
            self,
            padx=0,
            pady=0,
            relief=tk.RIDGE,
            text="Unknown",
            width=9,
        )  # note alphabetical order and consistent spacing
        self.chiplabel.grid(
            column=5, 
            row=0, 
            sticky=tk.W,
        )  # note grid is separate step

并且不要就地运行它,以便您可以在不运行任何内容的情况下import该类。那么你的serial.py看起来更像是:

from gui import GUI

interface = GUI()

interface.chiplabel.config(text="A.3f V")

interface.mainloop()

如果您想要多个框架,可以执行类似Switching between frames in tkinter menu的操作。