2015-06-16 30 views
-1

我的程序由3個類組成。整個程序在MainWindow類中運行。 MainWindow類首先初始化自身,接着是self.menubar對象。下一個對象是我給名爲self.journal的文本框。當使用多個對象時,在tkinter Python中查找屬性屬於哪個對象

一旦程序運行,我嘗試訪問open_file方法MainWindow,這是通過訪問filemenu方法Menubar完成的。當我嘗試打開文本文件時出現以下錯誤:AttributeError: 'Menubar' object has no attribute 'journal'發生此問題。

我試圖用MainWindow.journalTextBox.journal代替self.journal,它似乎不起作用。

class MainWindow(tk.Tk): 

    def __init__(self, *args, **kwargs): 


     tk.Tk.__init__(self, *args, **kwargs) 

     '''''' 
     '''''' 

     self.menubar = Menubar(self) # instantaiated Menubar object 

     ''''' 
     ''''' 
     self.journal = TextBox(self.frame, name='Journal') 
     ''''' 
     ''''' 



    def open_file(self): 
     filename = MainWindow.getFileNameOpen(self) 
     if filename == '': # No file chosen 
      filename = None 
     else: 
      self.MainWindow.journal.delete(1.0, END) # This line is the problem  
      fh = open(filename, 'r') 
      textFromFile = fh.read().rstrip()   
      self.MainWindow.journal.insert(1.0, textFromFile) 
      fh.close() 



class Menubar: 

    def __init__(self, parent): 
     self.menubar = tk.Menu(parent) 
     self.fileMenu(self.menubar) 

    def fileMenu(self, parent): 
     filemenu = tk.Menu(parent, tearoff=0) 
     filemenu.add_command(label='Open', accelerator='Ctrl+O', underline=0, command=lambda: MainWindow.open_file(self)) 



class TextBox(tk.Text): 

    def __init__(self, parent, name='', *args, **kwargs): 
     tk.Label(master=parent, text=name).pack() 
     tk.Text.__init__(self, master=parent, *args, **kwargs) 
     self.text.pack() 

我強調了引起我這個問題的線。它是根據def open_file(self)方法

+0

'Main'是什麼,你爲什麼使用全局? –

+0

對不起,我現在編輯它。 Main應該是MainWindow並且我已經刪除了全局文件 – firebird92

+0

您能否更新open_file函數的完整代碼,這會導致問題 –

回答

2

你可以嘗試像下面的代碼 -

類菜單欄:那我在self節省parent,然後使用self.pt代替Main.

def __init__(self, parent): 
    self.pt = parent 
    self.menubar = tk.Menu(parent) 
    self.fileMenu(self.menubar) 

def fileMenu(self, parent): 
    filemenu = tk.Menu(parent, tearoff=0) 
    filemenu.add_command(label='Open', accelerator='Ctrl+O', underline=0, command=lambda: self.pt.open_file()) 

通知,如果那也行不通,你也可以試試 -

lambda: MainWindow.open_file(self.pt) 

而不是th當前的lambda部分。

的問題是與代碼 -

lambda: MainWindow.open_file(self) 

這裏做的事情是,它試圖調用OPEN_FILE傳遞當前MenuBar類的實例(對象)作爲參數MainWindow類中的功能。

當你調用一個函數的類中,使用對象,可以說這樣的 -

obj.func(**params) 

內部,蟒蛇是如何調用這將是相當於ItsClass.func(obj, **params),因此open_file()功能裏面,當你訪問自我對象(通過參數傳入)時,它不是MainWindow的實例,而是MenuBar的實例。

+0

非常感謝。你能解釋我做錯了什麼嗎?是因爲我在調用類屬性而不是對象屬性? – firebird92

+0

已更新答案,並使其成爲社區維基 –

+0

感謝您的答案我會讓它成爲社區維基,但是在Google快速搜索之後,我發現只有版主才能使它成爲社區維基 – firebird92

相關問題