2013-05-01 144 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