2016-05-15 2 views
-1

У меня есть кнопка в главном окне и вы хотите отобразить информацию на этикетке, когда мышь входит в нее. Когда мышь покидает кнопку, ярлык должен меняться на пустой. Он должен работать как строка состояния, но разделен на правую и левую стороны.в способе получения: AttributeError <classname> экземпляр не имеет атрибута <name>

Я также попытался изменить метку согласно сообщению Bryan Oakley с помощью labelname.configure, но он не работает для меня, поэтому я до сих пор использую версию StringVar:

# -*- coding: utf-8 -*- 
import Tkinter as Tk, os 


class C_MasterGui(): 
    def __init__(self): 
     self.root = Tk.Tk() 
     self.root.title("Main window") 
     self.root.geometry("900x600+500+300") 
     #C_Menubar(self.root) 
     C_Buttonbar(self.root) 
     C_Workframe(self.root) 
     statusbar = C_Statusbar(self.root) 
     statusbar.create_statusbar(self.root) 

    def open_gui(self): 
     self.root.mainloop() 

    def close_gui(self): 
     pass 


class C_Buttonbar(): 
    def __init__(self,p_parent): 
     ICONPATH = os.getcwd() + "/graphics/" 
     ICONEXIT = Tk.PhotoImage(file=ICONPATH + "application-exit-5.png") 

     self.updatestatus = C_Statusbar(p_parent)        # Connect to statusbar 


     frIconToolbar = Tk.Frame(p_parent, height=30, relief="flat", bd=2) 
     frIconToolbar.pack(fill="x") 

     butExit = Tk.Button(frIconToolbar, image=ICONEXIT, width=30, relief="groove") 
     butExit.bind("<Enter>", self.iconExit_in) 
     butExit.bind("<Leave>", self.icon_out) 
     butExit.pack(side="left", ipadx=4, ipady=2, padx=4) 

    def iconExit_in(self, arg): 
     self.updatestatus.set_statusbar("your name","Programm beenden") 

    def icon_out(self, arg): 
     self.updatestatus.set_statusbar("your name","") 


class C_Workframe(): 
    def __init__(self,p_parent): 
     self.workframe = Tk.Frame(p_parent) 
     self.workframe.pack(fill="both", expand=1) 


class C_Statusbar(): 
    def __init__(self,p_parent): 
     self.parent = p_parent 

    def create_statusbar(self,p_parent): 
     # Initialize Texts for left and right statusbar 
     self.player_data = Tk.StringVar(p_parent) 
     self.action_text = Tk.StringVar(p_parent) 
     self.set_statusbar("current user: none","") 
     statusbar_left = Tk.Label(p_parent, textvariable=self.player_data, relief="groove", bd=2, font="Arial, 10", 
            anchor="w") 
     statusbar_left.pack(side="left", expand="yes",fill="x") 
     statusbar_right = Tk.Label(p_parent, textvariable=self.action_text, relief="groove", bd=2, font="Arial, 10", 
            anchor="e") 
     statusbar_right.pack(side="right", expand="yes", fill="x") 

    def set_statusbar(self,p_playerdata, p_actiontext): 
     print "Statusbar left:", p_playerdata, "Statusbar right:", p_actiontext 
     self.player_data.set(p_playerdata) 
     self.action_text.set(p_actiontext) 


# 
# 
if __name__ == '__main__': 
    myInstance = C_MasterGui() 
    myInstance.open_gui() 

Когда мышь входит или выходит метод кнопки set_statusbar вызывает эту ошибку:

Exception in Tkinter callback 
Traceback (most recent call last): 
    File "/usr/lib/python2.7/lib-tk/Tkinter.py", line 1489, in __call__ 
    return self.func(*args) 
    File "/home/gonzo/Spaces/Dokumente_remote/Python_Programmierprojekte/GolfTracker/test_statusbar.py", line 49, in iconExit_in 
    self.updatestatus.set_statusbar("your name","Programm beenden") 
    File "/home/gonzo/Spaces/Dokumente_remote/Python_Programmierprojekte/GolfTracker/test_statusbar.py", line 87, in set_statusbar 
    self.player_data.set(p_playerdata) 
AttributeError: C_Statusbar instance has no attribute 'player_data' 

Может ли кто-нибудь помочь мне с этой ошибкой?

ответ

0

Вам нужно создать строку состояния первого:

class C_Statusbar(): 
    def __init__(self,p_parent): 
     self.parent = p_parent 
     self.create_statusbar(p_parent) 

и удалить statusbar.create_statusbar(self.root) здесь:

class C_MasterGui(): 
    def __init__(self): 
     self.root = Tk.Tk() 
     self.root.title("Main window") 
     self.root.geometry("900x600+500+300") 
     #C_Menubar(self.root) 
     C_Buttonbar(self.root) 
     C_Workframe(self.root) 
     statusbar = C_Statusbar(self.root) 
     # called in `C_Statusbar.__init__)` already 
     #statusbar.create_statusbar(self.root) 
Смежные вопросы