2013-05-03 45 views
0

下面的代码有什么问题?我认为由于最后一个参数,它调用菜单栏时会引发异常?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) 

回答

5

必须在程序中的所有其他语句之后启动主应用程序循环(window.mainloop())。当你创建菜单时,你的主窗口已经被销毁了。

self.scrollbar.config(command=self.text.yview) 
    self.text.pack() 
    window.mainloop() # Remove this line 

... 

window = Tk()    
textfield = Textfield(window) 
menu = Menubar(window, textfield.text) 
window.mainloop() # <---- 
+0

太棒了,谢谢! – solarisman 2013-05-03 06:32:17