我正在尝试为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()
答案 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的操作。