我正在开发一个将显示大量信息的应用程序。 需要显示的信息是函数的返回值。
主屏幕/窗口是由一个类构建的,但在显示主屏幕之前,在加载某些信息期间会显示一个启动屏幕:
def updateLabel(window):
window.mainInfoLabel['Text']='New text'
def setmainScreen(main):
mainInfoFrame = tk.LabelFrame(
main,
text='Information: ',
width=700
)
mainInfoFrame.grid(row=1,column=1,padx=10,pady=10)
mainInfoLabel=tk.Label(CDSmainInfoFrame,text='Information:')
mainInfoLabel.grid(row=1,column=1,padx=5,pady=5)
Button=tk.Button(mainInfoFrame,text='run test',command=updateLabel(main))
testButton.grid(row=2,column=1,padx=5,pady=5)
## CLASSES
class Splash(tk.Toplevel):
def __init__(self, parent):
tk.Toplevel.__init__(self, parent)
self.title("Splash")
self.geometry("400x200")
self.overrideredirect(True)
self.label=Label(self,text="Please wait while we are loading the application")
self.label.pack(side="top", fill="both", expand=True)
## required to make window show before the program gets to the mainloop
self.update()
class App(tk.Tk):
def configureRoot(self):
self.resizable(False,False)
self.title("myApp")
self.geometry = ("800x800")
self.minsize(700,800)
def setupRootScreen(self):
self.mymenu=tk.Menu()
self.myfilemenu=tk.Menu(self.CDSmenu,tearoff=0)
self.myfilemenu.add_command(label='Exit',command=self.quit)
self.mymenu.add_cascade(label='File',menu=self.filemenu)
def __init__(self):
tk.Tk.__init__(self)
self.withdraw()
splash = Splash(self)
## setup stuff goes here
self.configureRoot()
self.setupRootScreen()
#### Do the loading stuff here...
time.sleep(2) #this is just to simulate loading
## finished loading so destroy splash
splash.destroy()
## show window again
self.deiconify()
setmainScreen(self)
# MAIN
if __name__ == "__main__":
root = App()
root.config(menu=root.mymenu)
root.mainloop()
这个效果很好。函数 setmainScreen(self) 创建一个框架,内部有标签和按钮,主窗口作为父窗口。这一切都有效 但是,如果我按下按钮,我想更改标签的文本。该应用程序将有很多标签,因此我想在 APP 类之外的外部函数中执行此操作,但对于这个问题,一个标签就足够了。
但是,当按下按钮时,我收到错误:
_tkinter.tkapp' object has no attribute 'mainInfoLabel'
因此将主窗口从 setmainScreen(main) 传递到 updateLabel(window) 不起作用,或者小部件无法识别。 所以我显然做错了什么。甚至不确定是否可以这样做?
如有任何帮助,我们将不胜感激! 先谢谢你了
您在任何时候都不会设置
window.mainInfoLabel
,因此该消息实际上是正确的。您试图在字典中设置一个不存在的键。在调用 updateLabel
之前,您需要执行以下操作:
window.mainInfoLabel = {}
顺便说一句,我不确定继承 tk.Tk 是最好的风格。最好有一个具有主窗口作为属性的 App 对象,这样您的所有应用程序变量就不会冒隐藏现有 Tk 名称的风险。您还会收到更多有用的错误消息,例如“'App'对象没有属性'mainInfoLabel'”