我正在尝试以下代码:
from tkinter import *
root = Tk()
class mainclass():
def myexit(self):
exit()
Label(root, text = "testing").pack()
Entry(root, text="enter text").pack()
Button(root, text="Exit",command=self.myexit).pack()
mainclass()
root.mainloop()
在运行时,我收到以下错误:
File "baseclass_gui.py", line 6, in <module>
class mainclass():
File "baseclass_gui.py", line 11, in mainclass
Button(root, text="Exit",command=self.myexit).pack()
NameError: name 'self' is not defined
如何为按钮命令定义self?
编辑:
我想把它放在一个类中的原因是:我使用的是pyreverse,它现在是pylint的一部分,它显示了不同类之间的图解关系。它似乎跳过在主模块级别运行的代码,因此我想将它也放在一个类中。见https://www.logilab.org/blogentry/6883
我发现以下代码有效:
root = Tk()
class mainclass():
def myexit(): # does not work if (self) is used;
exit()
Label(root, text = "testing").pack()
Entry(root, text="enter text").pack()
Button(root, text="Exit",command=myexit).pack()
mainclass()
root.mainloop()
使用此代码有什么问题吗?
答案 0 :(得分:3)
您无法在类级别引用self
,因为该对象尚未实例化。
尝试将这些语句放在__init__
方法中:
from tkinter import *
root = Tk()
class mainclass():
def myexit(self):
exit()
def __init__(self):
Label(root, text = "testing").pack()
Entry(root, text="enter text").pack()
Button(root, text="Exit",command=self.myexit).pack()
mainclass()
root.mainloop()
虽然从函数参数中删除self
确实有效,但是你留下了一个与它所在的类无关的静态方法。将函数放在全局范围内更加Pythonic情况下:
from tkinter import *
root = Tk()
def myexit():
exit()
class mainclass():
Label(root, text = "testing").pack()
Entry(root, text="enter text").pack()
Button(root, text="Exit",command=myexit).pack()
mainclass()
root.mainloop()