繁体   English   中英

以下Tkinter程序有什么问题?

[英]What's wrong with this following Tkinter program?

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

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

我的程序如下:

from Tkinter import *

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

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

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

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

    def say_hi(self):
        print "hi there, everyone!"

root = Tk()
# create the application
myapp = App(root)

myapp.master.title("My First App")
myapp.master.geometry('450x130')
myapp.master.resizable(0,0)

# start the program
root.mainloop()
def __init__(self, master=None):
    frame = Frame(master)
    frame.pack()
    self.createWidgets()

您在__init__定义的frame在任何其他方法中都不可见。 如果您希望能够访问它,则需要将其设为self的属性。

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

不要忘记包括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'崩溃AttributeError: App instance has no attribute 'master'错误。 发生这种情况的原因是,尽管您使App成为Frame的子类,但是您从未为其调用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"})

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM