Python3x tkinter中的辅助函数无法访问文本窗口小部件

时间:2015-01-12 23:07:15

标签: class user-interface python-3.x tkinter global-variables

我正在从参考书中学习python tkiner。这些例子以简单的方式编码,即不是类格式。我想在课堂上学习编码,因为我认为它有助于管理长代码。

我正在尝试使一个名为textPad的类中的辅助函数可以访问文本小部件(名为TextEditor)。辅助函数的工作是选择我输入的所有文本。但是,只要我运行脚本,就会出现the textPad is not defined的全局错误。即使我将self.添加到textPad,即self.textPad,我也会收到属性错误Class object has no attribute textPad.该代码是制作完整功能文本编辑器的练习的一部分。下面,我提供了生成错误的核心代码。这段代码有什么问题?

请您澄清一下我的怀疑:定义辅助函数的最佳位置在哪里:在课堂内或课堂外?在这两种情况下,如何使它们可访问?

from tkinter import *

class TextEditor():
    def __init__(self, root):

        self.select_all() #helper function declare

        myMenu = Menu(root, tearoff=0) #Menu bar
        editMenu = Menu(root, tearoff)
        editMenu.add_command(label="Select All", accelerator="Ctrl+A", command=select_all)
        myMenu.add_cascade(label="Edit", menu=editMenu)
        root.config(menu=myMenu)

        textPad = Text(root, wrap="word", undo=True)
        textPad.pack(expand="yes", fill="both")
    def select_all(self):
        textPad.tag_add('sel', '1.0', 'end')

if __name__ == '__main__':
    root=Tk()
    app = TextEditor(root)
    root.mainloop()

这是错误:

Traceback (most recent call last):
File "C:\Python33\gui\tkguibook\textpad.py", line 21, in <module>
app = TextEditor(root)
File "C:\Python33\gui\tkguibook\textpad.py", line 6, in __init__
self.select_all() #helper function declare
File "C:\Python33\gui\tkguibook\textpad.py", line 17, in select_all
textPad.tag_add('sel', '1.0', 'end')
NameError: global name 'textPad' is not defined

提前感谢您的帮助!

1 个答案:

答案 0 :(得分:3)

首先,我建议您在不使用tkinter的情况下在Python中观看面向对象范例的一些教程。

代码的问题是textPad不是类的属性,但它是__init__方法或构造函数的简单局部变量。要使其成为属性,您应该使用self声明然后引用刚刚声明的属性。

例如,假设我有以下类:

class TextEditor:
    def __init__(self):
        # stuff

并且您想添加一个属性,在您的课程的所有点中都可见,您可以这样做:

class TextEditor:
    def __init__(self):
        self.textPad = tkinter.Text()  # using 'self' to declare a property

现在,如果你想在另一种方法中引用该属性,你应该始终使用self

class TextEditor:
    def __init__(self):
        self.textPad = tkinter.Text()

    def set_text(self, new_text):
        self.textPad.insert(tkinter.END, "hello")  # using 'self' to refer to the property

了解有关self的更多信息。