我正在从参考书中学习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
提前感谢您的帮助!
答案 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的更多信息。