我正在学习使用Tkinter用python创建简单的gui。我目前正在使用python文档作为参考(link)。
我要做的第一件事就是理解那里的示例代码。我特别关注这段代码,它创建了一个带有两个按钮的对话框,一个用于在控制台上打印某些内容,另一个用于关闭程序:
from Tkinter import *
class Application(Frame):
def say_hi(self):
print "hi there, everyone!"
def createWidgets(self):
self.QUIT = Button(self)
self.QUIT["text"] = "QUIT"
self.QUIT["fg"] = "red"
self.QUIT["command"] = self.quit
self.QUIT.pack({"side": "left"})
self.hi_there = Button(self)
self.hi_there["text"] = "Hello",
self.hi_there["command"] = self.say_hi
self.hi_there.pack({"side": "left"})
def __init__(self, master=None):
Frame.__init__(self, master)
self.pack()
self.createWidgets()
root = Tk()
app = Application(master=root)
app.mainloop()
root.destroy()
我知道createWidgets函数将所有元素放在屏幕中(以某种方式使用defin I t语句创建),但我不明白为什么主屏幕是使用该init名称创建的。我以为这是一个约定,但当我将“main”的“in I t”更改为“main”时,按钮并没有放在屏幕中,所以我不知道主屏幕是否必须始终使用该名称创建,或者是我在那里做错了什么。
我也不明白为什么每个函数都是使用(self)创建的(这意味着什么?)或者当我在示例代码中没有看到任何类型的主循环定义时,为什么在最后调用.main loop(我想启动整个程序)。
我对对象的工作方式有基本的了解,但在处理这些事情时,我发现python有点混乱。我已经看过关于这方面的python文档,但对我来说这似乎有点模糊。
任何形式的链接到更具体的文档(比我正在使用的python不那么含糊)都会非常受欢迎。
从类创建对象时,将“实例化”该类。执行此操作时,将执行
__init__
方法。把__init__
看作“初始化”。当你写信的时候
您正在通过创建名为
app
的类对象来实例化Application
类。通过传入
Tk()
,您的类继承了Tk
类的方法,从而使您的类具有与Tk()
类相同的功能(按钮、标签、复选框等)。self
是类对象,在您的例子中是app
。在每个类方法中始终传递对对象的引用似乎是多余的或不必要的,但是python需要这样做,所以请习惯于始终使用self
。self是因为代码位于“类”形式中,所以当您使用它时,您处于“对象样式”的范围内,因此它们总是使用self的属性,有关更多信息,请检查Python Object Oriented的这个链接
如果我没有错的话,init/strong>也与对象的使用有关,因此有必要使用这个init/strong>来让事情正常工作。
关于mainloop,这是一个名为mainloop()的函数,您将从Tkinter导入它,这是在开始时完成的,没有这个函数,任何东西都不会以应有的方式显示,如果您使用或尝试使用pygame,您会发现他们也以类似的方式使用这个主循环,我想它应该会以每秒特定帧数更新屏幕显示。
顺便说一下,你会发现Tkinter用不同的方法做同样的事情, 至少我看到了三种方法:一种是像你的例子,一种非常有组织的风格;第二种是所有代码都按照逻辑顺序排列,但似乎有点笨拙;第三种是类似于你的例子代码,但有另一种扭曲。所以你必须尝试不同的风格,以便学习不同的技巧。
你的问题似乎与课程有关。
基本上,类的
__init__
方法在创建该类的实例时就被调用。在代码中创建的实例示例如下:
这意味着您的类必须被称为“Application”,尽管您还没有包含该部分。
app现在是Application类的
'instance'
。它是一个类对象,通过它可以访问类方法(类中的函数)和类属性(类中的变量)。名称
__init__
不是约定,调用其他名称将意味着它不再提供相同的函数。记住,它是在创建一个实例(或实例化)类时执行的。(app = Application()
),而不是像任何其他方法那样通过调用它来执行。它“初始化”这个类,用你指定的任何代码设置它,所以它几乎在你使用它之前就准备好了。我花了一点时间才领会。单词
self
实际上是一个约定,从技术上讲,您可以在那里使用任何单词,但您不应该这样做,否则您将被最近的程序员责骂。但这个词必须存在,而且应该是'self'
。为什么?它是做什么的?好。。。如前所述,当您实例化(创建)类的实例,并且您希望使用类方法等时,您需要一种方法使任何特定实例与任何其他实例区分开来,它只是引用自身(因此是self)的一种方法。 因此类属性被赋予
self.
前缀,类方法被赋予'self'
作为第一个参数作为规则。我的理解是,虽然你实际上只编写了一个应用程序类,但是每次你创建一个新的实例,app1,app2,app3,无论如何,它们都有一种指针,专门引用它们,由self提供,所以当你使用其中一个指针和访问方法等时,你的实际类知道你在处理哪一个。如果我正在使用您的应用程序实例
app
,并且想要使用该类的属性(变量),我只需要说app.attribute
,并访问一个方法app.method
。在这种情况下,我根本不需要使用self。但是,要调用方法或引用类本身代码中的属性,它是self.attribute
和self.method(args)
(请注意,当您从类内实际调用方法时,self是前缀,而不是参数)如果这不是很清楚,我很抱歉。这些都是很难解释的,我也在学习自己。希望这能有所帮助。
相关问题 更多 >
编程相关推荐