我在这里关注教程示例: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)
并创建多个三重按钮。
所以我的问题是:
'大师'到底做了什么?
如果我从__init__(self,master)
中取出主人,它会给我一个关于没有足够论据的错误
此外,我不需要使用app=Application(root)
,我只能运行Application(root)
,但仍然可以使root.mainloop()
正常工作,那么app = Application(root)
的目的是什么{{1}} 1}}
由于
答案 0 :(得分:1)
按顺序回答您的问题
master
参数是每个窗口小部件的“父窗口小部件”,默认为None
Tkinter.Frame
。请注意,您将self
(即Frame
)作为master
传递给每个Button
;
这不是一个真正的问题,但是如果您将定义更改为def __init__(self)
,那么请致电app = Application(root)
,您将获得TypeError
,因为root
参数包含app = Application(root)
无处可去;以及
设置__init__
的重点只是您稍后可以访问它。您的示例很简单,没有实例方法可以在class Application(Tkinter.Frame):
之外调用,但情况可能并非总是如此。
要澄清1.注意
Application
表示所有Tkinter.Frame
类实例都从def __init__(self, master):
继承方法和属性。这个不与例如
Application.__init__
这意味着self
接受两个参数(第一个,在所有实例方法中按约定称为app = Application(root)
,是类实例本身,通常是隐式传递的)。当你打电话
__init__
这涉及Application.__init__(app, root)
定义,(粗略地)意味着
__init__
如果self
没有两个参数(master
和TypeError
),那么您将获得self
,因为有两个参数(隐式实例{ {1}}和显式父窗口小部件master
)和Python只知道如何处理其中一个。