我正在学习使用 Tkinter 使用 python 创建简单的 GUI。我目前正在使用 python 文档作为参考(link http://docs.python.org/2/library/tkinter.html).
我想做的第一件事是理解那里的示例代码。我正在特别查看这段代码,它创建一个带有两个按钮的对话框,一个用于在控制台上打印某些内容,另一个用于关闭程序:
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 将所有元素放置在屏幕中(这是用 def 创建的)init声明),但我不明白为什么使用它创建主屏幕init姓名。我以为这是约定,但当我改变了’init' 对于“主”,按钮没有放置在屏幕中,所以我不知道主屏幕是否必须始终使用该名称创建,或者是我在那里做错了什么。
我也不明白为什么每个函数都是使用 (self) 创建的(这是什么意思?)或者为什么当我没有看到任何类型的 main 时在最后调用 .mainloop (我想启动整个程序)示例代码中任意位置定义的循环。
我对对象的工作原理有基本的了解,但我发现 python 在处理此类事情时有点令人困惑。我已经看过这方面的 python 文档,但对我来说似乎有点模糊。
任何类型的更具体文档的链接(比我正在使用的 python 文档更清晰的链接)将不胜感激。
您的问题似乎与课程有关。
基本上,__init__
一旦创建了该类的实例,就会调用该类的方法。
在代码中创建的实例的示例是:
app = Application(master=root)
这意味着您的类必须称为“应用程序”,尽管您尚未包含该部分。
应用程序现在是'instance'
应用程序类的。它是一个类对象,通过它可以访问类方法(类内的函数)及其类属性(类内的变量)。
名字__init__
不是一个约定,将其称为其他名称将意味着它不再具有相同的功能。请记住,它是在您创建(或实例化)该类的实例时执行的。(app = Application()
)而不是像任何其他方法一样专门调用它。它“初始化”类,使用您指定的任何代码对其进行设置,因此几乎在您使用它之前它就准备好了。
self
我花了一点时间才明白。这个单词self
,实际上是一个约定,从技术上讲,你可以在那里使用任何单词,但你永远不应该这样做,否则你会被最近的程序员骂。然而这个词确实必须在那里,而且应该是'self'
。为什么?它有什么作用?出色地...
当您实例化(创建类的实例)时,如上所述,并且您想要使用类方法等,您需要一种方法让任何特定实例将其自身与任何其他实例区分开来,这只是引用自身的一种方式(因此这个词是“自我”)。
因此类属性被赋予 'self.
' 给出了前缀和类方法'self'
通常作为第一个参数。我的理解是,虽然你实际上只编写了一个 Application 类,但每次创建一个新实例时,app1、app2、app3 等等,它们都有一种由自己提供的专门引用它们的指针,所以当你使用其中之一并访问方法等。您的实际类知道您正在处理哪一个。
如果我使用您的应用程序实例,app
,并且想使用该类的属性(变量),我只想说app.attribute
并访问一个方法,app.method
。在这种情况下我根本不需要使用 self 。但是,要在类本身的代码中调用方法或引用属性,则需要self.attribute
and self.method(args)
(请注意,当您实际从类内调用该方法时, self 是前缀,而不是 arg 。)
如果这不是很清楚,我很抱歉。这些都是很难解释的事情,我自己也在学习。希望这个对你有帮助。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)