Tkinter Python 更新类外函数中的标签

问题描述 投票:0回答:1

我正在开发一个将显示大量信息的应用程序。 需要显示的信息是函数的返回值。

主屏幕/窗口是由一个类构建的,但在显示主屏幕之前,在加载某些信息期间会显示一个启动屏幕:

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) 不起作用,或者小部件无法识别。 所以我显然做错了什么。甚至不确定是否可以这样做?

如有任何帮助,我们将不胜感激! 先谢谢你了

python python-3.x tkinter
1个回答
0
投票

您在任何时候都不会设置

window.mainInfoLabel
,因此该消息实际上是正确的。您试图在字典中设置一个不存在的键。在调用
updateLabel
之前,您需要执行以下操作:

window.mainInfoLabel = {}

顺便说一句,我不确定继承 tk.Tk 是最好的风格。最好有一个具有主窗口作为属性的 App 对象,这样您的所有应用程序变量就不会冒隐藏现有 Tk 名称的风险。您还会收到更多有用的错误消息,例如“'App'对象没有属性'mainInfoLabel'”

© www.soinside.com 2019 - 2024. All rights reserved.