下面这个Tkinter程序有什么问题?

2024-09-29 05:25:06 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图执行我的第一个tkinter应用程序,但它给我的错误如下所示。知道为什么“frame”对同一个类的函数不可见吗?在

Traceback (most recent call last):
File "C:\Data\Personal\Python\Tkinter\GUI_ver1.py", line 25, in <module>
myapp = App(root)
File "C:\Data\Personal\Python\Tkinter\GUI_ver1.py", line 7, in __init__
self.createWidgets()
File "C:\Data\Personal\Python\Tkinter\GUI_ver1.py", line 10, in createWidgets
self.button = Button(frame, text="QUIT", fg="red", command=frame.quit)
NameError: global name 'frame' is not defined

我的计划如下:

^{pr2}$

Tags: inpyself应用程序datatkinter错误line
1条回答
网友
1楼 · 发布于 2024-09-29 05:25:06
def __init__(self, master=None):
    frame = Frame(master)
    frame.pack()
    self.createWidgets()

__init__中定义的frame在任何其他方法中都不可见。如果你想访问它,你需要使它成为self的属性。在

^{pr2}$

在使用变量时,不要忘记包括self.。在

def createWidgets(self):
    self.button = Button(self.frame, text="QUIT", fg="red", command=self.frame.quit)
    self.button.pack(side=LEFT)

    self.hi_there = Button(self.frame, text="Hello", command=self.say_hi)
    self.hi_there.pack(side=LEFT)

这是解决NameError的最简单方法,但是您的代码仍然会因为AttributeError: App instance has no attribute 'master'错误而崩溃。发生这种情况是因为,尽管您将App作为Frame的子类,但从未为其调用Frame初始值设定项,因此当您尝试调用框架方法时,它会变得混乱。记得打电话给__init__。在

def __init__(self, master=None):
    Frame.__init__(self, master)
    frame = Frame(master)
    frame.pack()
    self.createWidgets()

有了最后的添加,您的代码应该可以正常工作,但是它比需要的复杂一些。您的App实例是一个框架,但它本身也包含一个框架,self.frame。您可以通过删除第二个框架并直接向self添加小部件来简化这一过程。在

class App(Frame):
    def __init__(self, master=None):
        Frame.__init__(self, master)
        self.pack()
        self.createWidgets()

    def createWidgets(self):
        self.button = Button(self, text="QUIT", fg="red", command=self.quit)
        self.button.pack(side=LEFT)

        self.hi_there = Button(self, text="Hello", command=self.say_hi)
        self.hi_there.pack(side=LEFT)

        self.hi_there.pack({"side": "right"})

相关问题 更多 >