关于以Tkinter为例的类的基本问题

时间:2014-01-12 07:51:27

标签: python class tkinter frame init

我在这里关注教程示例:http://www.youtube.com/watch?v=YCLTv6wh3jE

我稍微修改了源代码(基本上是导入Tkinter而不是Tkinter import *)

#more complexed gui

import Tkinter

class Application(Tkinter.Frame):
    """a gui application with 3 buttons"""

    def __init__(self,master):
        """Initialize the Frame"""
        Tkinter.Frame.__init__(self,master)
        self.grid()
        self.create_widgets()

    def create_widgets(self):
        """create 3 buttons that do nothing"""
        self.button1 = Tkinter.Button(self, text="this is the 1st button")
        self.button1.grid()

        self.button2 = Tkinter.Button(self)
        self.button2.grid()
        self.button2.configure(text="this is 2nd butt")

        self.button3 = Tkinter.Button(self)
        self.button3.grid()
        self.button3["text"] = "this is 3rd butt"

root = Tkinter.Tk()
root.title("some GUI")
root.geometry("1024x768")

app = Application(root)

root.mainloop()

我意识到如果我从master取出Tkinter.Frame.__init__(self,master),代码仍会运行,不仅如此,我还可以运行app=Application(root)并创建多个三重按钮。

所以我的问题是:

  1. '大师'到底做了什么?

  2. 如果我从__init__(self,master)中取出主人,它会给我一个关于没有足够论据的错误

  3. 此外,我不需要使用app=Application(root),我只能运行Application(root),但仍然可以使root.mainloop()正常工作,那么app = Application(root)的目的是什么{{1}} 1}}

  4. 由于

1 个答案:

答案 0 :(得分:1)

按顺序回答您的问题

  1. master参数是每个窗口小部件的“父窗口小部件”,默认为None Tkinter.Frame。请注意,您将self(即Frame)作为master传递给每个Button;

  2. 这不是一个真正的问题,但是如果您将定义更改为def __init__(self),那么请致电app = Application(root),您将获得TypeError,因为root参数包含app = Application(root)无处可去;以及

  3. 设置__init__的重点只是您稍后可以访问它。您的示例很简单,没有实例方法可以在class Application(Tkinter.Frame): 之外调用,但情况可能并非总是如此。

  4. 要澄清1.注意

    Application

    表示所有Tkinter.Frame类实例都从def __init__(self, master): 继承方法和属性。这个与例如

    中的函数参数相同
    Application.__init__

    这意味着self接受两个参数(第一个,在所有实例方法中按约定称为app = Application(root) ,是类实例本身,通常是隐式传递的)。当你打电话

    __init__

    这涉及Application.__init__(app, root) 定义,(粗略地)意味着

    __init__

    如果self没有两个参数(masterTypeError),那么您将获得self,因为有两个参数(隐式实例{ {1}}和显式父窗口小部件master)和Python只知道如何处理其中一个。