__使用tkin在图形用户界面中初始化

2024-05-19 17:38:12 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在学习使用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不那么含糊)都会非常受欢迎。


Tags: 代码文档selfmaster屏幕initmaintkinter
3条回答

从类创建对象时,将“实例化”该类。执行此操作时,将执行__init__方法。把__init__看作“初始化”。

当你写信的时候

app = Application(master=Tk())

您正在通过创建名为app的类对象来实例化Application类。

通过传入Tk(),您的类继承了Tk类的方法,从而使您的类具有与Tk()类相同的功能(按钮、标签、复选框等)。

self是类对象,在您的例子中是app。在每个类方法中始终传递对对象的引用似乎是多余的或不必要的,但是python需要这样做,所以请习惯于始终使用self

self是因为代码位于“类”形式中,所以当您使用它时,您处于“对象样式”的范围内,因此它们总是使用self的属性,有关更多信息,请检查Python Object Oriented的这个链接

如果我没有错的话,init/strong>也与对象的使用有关,因此有必要使用这个init/strong>来让事情正常工作。

关于mainloop,这是一个名为mainloop()的函数,您将从Tkinter导入它,这是在开始时完成的,没有这个函数,任何东西都不会以应有的方式显示,如果您使用或尝试使用pygame,您会发现他们也以类似的方式使用这个主循环,我想它应该会以每秒特定帧数更新屏幕显示。

顺便说一下,你会发现Tkinter用不同的方法做同样的事情, 至少我看到了三种方法:一种是像你的例子,一种非常有组织的风格;第二种是所有代码都按照逻辑顺序排列,但似乎有点笨拙;第三种是类似于你的例子代码,但有另一种扭曲。所以你必须尝试不同的风格,以便学习不同的技巧。

你的问题似乎与课程有关。

基本上,类的__init__方法在创建该类的实例时就被调用。

在代码中创建的实例示例如下:

app = Application(master=root)

这意味着您的类必须被称为“Application”,尽管您还没有包含该部分。

app现在是Application类的'instance'。它是一个类对象,通过它可以访问类方法(类中的函数)和类属性(类中的变量)。

名称__init__不是约定,调用其他名称将意味着它不再提供相同的函数。记住,它是在创建一个实例(或实例化)类时执行的。(app = Application()),而不是像任何其他方法那样通过调用它来执行。它“初始化”这个类,用你指定的任何代码设置它,所以它几乎在你使用它之前就准备好了。

我花了一点时间才领会。单词self实际上是一个约定,从技术上讲,您可以在那里使用任何单词,但您不应该这样做,否则您将被最近的程序员责骂。但这个词必须存在,而且应该是'self'。为什么?它是做什么的?好。。。

如前所述,当您实例化(创建)类的实例,并且您希望使用类方法等时,您需要一种方法使任何特定实例与任何其他实例区分开来,它只是引用自身(因此是self)的一种方法。 因此类属性被赋予self.前缀,类方法被赋予'self'作为第一个参数作为规则。我的理解是,虽然你实际上只编写了一个应用程序类,但是每次你创建一个新的实例,app1,app2,app3,无论如何,它们都有一种指针,专门引用它们,由self提供,所以当你使用其中一个指针和访问方法等时,你的实际类知道你在处理哪一个。

如果我正在使用您的应用程序实例app,并且想要使用该类的属性(变量),我只需要说app.attribute,并访问一个方法app.method。在这种情况下,我根本不需要使用self。但是,要调用方法或引用类本身代码中的属性,它是self.attributeself.method(args)(请注意,当您从类内实际调用方法时,self是前缀,而不是参数)

如果这不是很清楚,我很抱歉。这些都是很难解释的,我也在学习自己。希望这能有所帮助。

相关问题 更多 >