2013-05-01 106 views
0

我對Python和麪向對象編程非常陌生。所以請原諒,如果我問一個愚蠢的問題: 下面應該是一個簡單的文本編輯器。我想要將文本框和菜單欄放在單獨的類中。當前的錯誤消息是:兩個類的交互,python

File "Editor_play.py", line 19, in __init__ 
    menubar = Menu(window) 
RuntimeError: maximum recursion depth exceeded 

我的問題:

  1. 我必須打電話給文本字段的對象和菜單的目標和我一樣,或者我應該調用對象文本字段,並紛紛致電Textfield內的菜單?
  2. 如何在Textfield中獲得關於self.text的菜單?

感謝您的期待。

from Tkinter import * 
import tkFileDialog 

class Textfield(object): 
    def __init__(self, window): 
    self.window = window 
    window.title("text editor") 
    self.scrollbar = Scrollbar(window) 
    self.scrollbar.pack(side="right",fill="y") 
    self.text = Text(window,yscrollcommand=self.scrollbar.set) 
    self.scrollbar.config(command=self.text.yview) 
    self.text.pack() 
    window.mainloop() 


class Menu(object): 
    def __init__(self, window): 
    self.window = window 
    menubar = Menu(window) 
    filemenu = Menu(menubar) 
    filemenu.add_command(label="load",command=self.load) 
    filemenu.add_command(label="save as",command=self.saveas) 
    menubar.add_cascade(label="file",menu=filemenu) 
    window.config(menu=menubar) 

    def load(self): 
    self.file = tkFileDialog.askopenfile() 
    self.text.delete(1.0, END) 
    if self.file: 
     self.text.insert(1.0, self.file.read()) 

    def saveas(self): 
    self.file = tkFileDialog.asksaveasfile() 
    if self.file: 
     self.file.write(self.text.get(1.0, END)) 


window = Tk()    
textfield = Textfield(window) 
menu = Menu(window) 

現在它看起來像這樣,它仍然是不正確的。

菜單類的原因是,我想了解這是如何工作的一般。因爲我可以有另一個應用程序相同的菜單,然後我會把菜單類放入一個模塊。

在學習如何使用python編程的過程中,對這兩個示例類之間交互的理解似乎對我來說是一個里程碑。我瞭解的那些,我可以繼續。我早些時候在另一篇文章中問過我是否可以在構建(進入課堂)時犯錯或者造成死衚衕。答案是:一切皆有可能,沒有任何限制。現在我想應用這個例子。請幫忙。

當前的錯誤消息是:

""" 
Traceback (most recent call last): 
    File "Editor_play.py", line 41, in <module> 
    menu = Menubar(window, textfield.text) 
    File "Editor_play.py", line 20, in __init__ 
    menubar = Menu(window) 
    File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-tk/Tkinter.py", line 2580, in __init__ 
    File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-tk/Tkinter.py", line 1974, in __init__ 
_tkinter.TclError: this isn't a Tk applicationNULL main window 
""" 



from Tkinter import * 
import tkFileDialog 

class Textfield(object): 
    def __init__(self, window): 
    self.window = window 
    window.title("text editor") 
    self.scrollbar = Scrollbar(window) 
    self.scrollbar.pack(side="right",fill="y") 
    self.text = Text(window,yscrollcommand=self.scrollbar.set) 
    self.scrollbar.config(command=self.text.yview) 
    self.text.pack() 
    window.mainloop() 


class Menubar(object): 
    def __init__(self, window, text): 
    self.window = window 
    self.text = text 
    menubar = Menu(window) 
    filemenu = Menu(menubar) 
    filemenu.add_command(label="load",command=self.load) 
    filemenu.add_command(label="save as",command=self.saveas) 
    menubar.add_cascade(label="file",menu=filemenu) 
    window.config(menu=menubar) 

    def load(self): 
    self.file = tkFileDialog.askopenfile() 
    self.text.delete(1.0, END) 
    if self.file: 
     self.text.insert(1.0, self.file.read()) 

    def saveas(self): 
    self.file = tkFileDialog.asksaveasfile() 
    if self.file: 
     self.file.write(self.text.get(1.0, END)) 


window = Tk()    
textfield = Textfield(window) 
menu = Menubar(window, textfield.text) 
+0

在'Menu'中你引用'self.text',但是你沒有在那裏定義它。 – 2013-05-01 20:55:26

+2

您的'Menu'類創建一個* Menu *的* new *實例,然後創建一個新的'Menu'實例,並且無限。那麼,至少在RecursionError之前。什麼是嵌套'菜單'對象應該做的? – 2013-05-01 20:59:38

回答

1

Menu類覆蓋Tkinter菜單類。將它重命名爲別的,你不會有這個問題。

讓菜單知道Textfield的方法是將您的Textfield實例作爲參數傳遞到菜單類構造函數中。更好的是,如果你只是在編寫一個簡單的文本編輯器,那麼你不需要爲MenuTextfield分別設置類。你可以有一個「app」類,它是根對象的子類。

+0

好的我改變了班級的名字。即使腳本很小,但我想分成兩個類,因爲我想了解它是如何工作的。 – solarisman 2013-05-02 07:56:50