【问题标题】:Class `Call __ instance as first argument error` Tkinter类`调用__实例作为第一个参数错误`Tkinter
【发布时间】:2015-10-23 05:28:48
【问题描述】:

我正在制作一个 Tkinter 文本编辑器,但在使用类时遇到了一些问题。我已经创建了一个包含我所有函数的类和一个包含我的主循环的类。根窗口可以正常打开,但是当按下保存按钮时出现错误

Exception in Tkinter callback
Traceback (most recent call last):
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-tk/Tkinter.py", line 1536, in __call__
    return self.func(*args)
TypeError: unbound method saveas() must be called with F instance as first argument (got nothing instead)

我看过这个和这个例子,但不知道出了什么问题。 我的问题是什么?

以下是说明问题的简短代码。

from Tkinter import *
class Main(object):
    def __init__(self, root):
        root.title("PyText")
        self.m1=Menu(root)
        self.fm=Menu(self.m1, tearoff=0)
        self.fm.add_command(label="New", command=self.saveas())
        self.fm.add_command(label="Open", command=self.saveas())
        self.fm.add_command(label="Save", command=self.saveas())
        self.fm.add_command(label="Save as...", command=self.saveas())
        self.fm.add_command(label="Close", command=self.saveas())
        self.fm.add_separator()

        self.fm.add_command(label="Exit", command=root.quit)
        self.m1.add_cascade(label="File", menu=self.fm)
        self.editmenu = Menu(self.m1, tearoff=0)
        self.editmenu.add_command(label="Undo", command=self.saveas())

        self.editmenu.add_separator()

        self.editmenu.add_command(label="Cut", command=self.saveas())
        self.editmenu.add_command(label="Copy", command=self.saveas())
        self.editmenu.add_command(label="Paste", command=self.saveas())
        self.editmenu.add_command(label="Delete", command=self.saveas())
        self.editmenu.add_command(label="Select All", command=self.saveas())

        self.m1.add_cascade(label="Edit", menu=self.editmenu)
        self.helpmenu = Menu(self.m1, tearoff=0)
        self.helpmenu.add_command(label="Help Index", command=self.saveas())
        self.helpmenu.add_command(label="About...", command=self.saveas())
        self.m1.add_cascade(label="Help", menu=self.helpmenu)

        root.config(menu=self.m1)


        self.t1=Text(root)
        self.t1.config(width=90, height=40)
        self.t1.grid()
    def saveas(self):
        self.filewin = Toplevel()
        self.e1=Entry(self.filewin)
        self.e1.grid()
        self.button = Button(self.filewin, text="Save", command=self.save)
        self.button.grid()

    def save(self):
        with open(self.e1.get(), "w") as f: # this instance variable can be accessed
            f.write(self.t1.get('1.0', 'end')) # added self.t1 above, and start/end


root = Tk()
app = Main(root)
root.mainloop()

【问题讨论】:

    标签: python class tkinter


    【解决方案1】:

    您正在构建错误的应用程序。从该类中取出根 Tkinter 对象构建代码。您将需要一个包含 Tkinter 对象内容的类。如果您想为其他类型的对象提供更多类,那很好。实际上,您将F.saveas 作为一个没有参数的类方法调用,它期待self,它是F 类的一个实例,因为您从未实例化它,所以您没有它。

    from Tkinter import *
    class Main(object):
        def __init__(self, root):
            # root.geometry("100x100") # this will make your app window tiny -
            # I've commented it out for now but you'll need to look into it
            self.b1 = Button(root, text="save", command=self.saveas)
            self.b1.grid()
            self.t1 = Text(root) # added a Text widget
            self.t1.grid()
        def saveas(self):
            filewin = Toplevel()
            self.e1=Entry(filewin) # make this an instance variable
            self.e1.grid()
            button = Button(filewin, text="Save", command=self.save)
            button.grid()
        def save(self):
            with open(self.e1.get(), "w") as f: # this instance variable can be accessed
                f.write(self.t1.get('1.0', 'end')) # added self.t1 above, and start/end
    
    master = Tk()
    app = Main(master)
    root.mainloop()
    

    【讨论】:

    • 我现在已经编辑了我的代码以包含我的完整代码,因为执行您所做的操作会产生更多错误。
    • @JonahFleming - 你遇到了什么错误?当我将所有command=self.saveas() 更改为command=self.saveas 时,它似乎工作正常。
    • 我会试一试,但我让所有菜单项在程序开始时运行它们的命令。
    • @JonahFleming - 这就是为什么我将所有command=self.saveas() 更改为command=self.saveas,正如我在之前的评论中所说的那样。
    • 谢谢,这真的很有用+1
    猜你喜欢
    • 1970-01-01
    • 2017-04-03
    • 2013-12-31
    • 1970-01-01
    • 1970-01-01
    • 2017-11-30
    • 2017-03-15
    • 1970-01-01
    • 2016-07-22
    相关资源
    最近更新 更多