GUI 中的 __init__ 与 tkinter

2024-03-29

我正在学习使用 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(使用前将#替换为@)

GUI 中的 __init__ 与 tkinter 的相关文章

随机推荐

  • java中如何将rgb颜色转换为int

    Paint setColor期待一个整数 但我有的是Color目的 我没有看到color getIntValue 在Java中 那么我该怎么做呢 我想要的是类似的东西 public Something myMethod Color rgb
  • 仅针对特定端点的其余模板日志记录请求和响应

    我正在尝试记录 Resttemplate 请求和响应以及它working我的参考是这个https www baeldung com spring resttemplate logging https www baeldung com spr
  • TensorFlow 对象检测 API - 内存不足

    我正在使用 Tensorflow 对象检测 API 来训练我自己的对象检测器 我下载了faster rcnn inception v2 coco 2018 01 28来自模型动物园 here https github com tensorf
  • isalpha() 给出一个断言

    我有一个 C 代码 其中在 ctype h 中使用标准库函数 isalpha 这是在 Visual Studio 2010 Windows 上 在下面的代码中 如果 char c 是 则 isalpha 调用将返回一个断言 如下面的快照所示
  • 模式切换是否发生从用户线程切换到内核线程?

    我对用户 内核线程和模式 上下文切换感到困惑 平台 Linux 我有两个相关的问题 1 下列句子正确的是 如果我进行系统调用 则会发生模式切换 用户模式到内核模式 并最终从用户线程切换到内核线程 由于系统调用只能在内核线程中执行 因此我认为
  • Define True,如果不定义,会导致语法错误

    我今天在别人的代码中发现了以下构造 try True False except NameError True 1 1 False 1 0 据我了解 它定义了True and False如果它们尚未定义 因此 如果定义了它们 则不应抛出Nam
  • 在 Rails 中制作用户年龄的饼图

    我的用户模型中有这个函数可以计算用户年龄 def get age now Time now utc to date now year dob year now month gt dob month now month dob month n
  • Ionic:Android 模拟器错误

    我正在尝试使用 Android Studio v3 0 附带的 Android 模拟器来测试我的 Ionic 3 16 0 混合应用程序 myapp gt ionic cordova build android成功创建构建 但当我跑步时 m
  • 画布在鼠标事件上获取点

    我有以下函数来获取鼠标单击位置 坐标 myCanvas on click function e event e event event window event var canvas document getElementById myCa
  • 适用于 Windows 的 Docker 桌面

    我正在尝试在我的 Windows 10 Pro 64 位计算机上运行 Docker 桌面 其构建规范和设置详细信息如下 版本 Windows 10 专业版 64 位 版本 1903 操作系统版本 18362 657 CPU 英特尔 i7 H
  • MySql触发器更新选择插入后的总和

    我有三张桌子 Members Accounts 交易 在将新事务插入事务表后 我想用所有 Transactions TransactionAmount 的总和更新 Accounts AccountBalance 以下代码似乎对我不起作用 有
  • 不幸的是 已停止

    所以我不知道关于双重帖子的规则是什么 任何我在其他问题上没有得到后续支持的人 任何我的问题被陈述的人 这是我的 logcat 05 28 19 45 03 464 I ActivityManager 274 Start proc xela
  • UnicodeEncodeError:“ascii”编解码器无法对位置 47 中的字符 u'\u2019' 进行编码:序数不在范围内(128)

    我正在使用 Python 2 7 和 MySQLdb 1 2 3 我尝试了在 stackoverflow 和其他论坛上找到的所有内容来处理我的脚本抛出的编码错误 我的脚本从源 MySQL 数据库中的所有表中读取数据 并将它们写入 pytho
  • django modelformset_factory 中的 MultiValueDictKeyError

    我正在尝试实现一个编辑表单集 然后 我使用 modelformset factory 实例化表单集中的对象 当请求不是 POST 时 表单集会完美加载 但是 如果请求是 POST 则表单集构造函数会引发 MultiValueDictKeyE
  • 出口交易需要客户名称和地址 - Stripe 错误

    我正在使用 stripe SDK 创建客户并使用 API 向客户收费 但出现错误 致命错误 未捕获 状态 400 请求 req ZyqUtykjUcOqrU 根据印度法规 出口交易需要客户名称和地址 更多信息请参见 https stripe
  • SQL Server 逆透视两列

    我正在尝试旋转表格以获得 3 列 我的示例表如下 CREATE TABLE tbl1 A1 int cA1 int A2 int cA2 int A3 int cA3 int GO INSERT INTO tbl1 VALUES 60 2
  • Wt C++ Web 框架的主机,部署问题

    我想知道 justhost com 是否足以托管 Wt C 网站 应用程序 它确实允许 FTP 和 SSH 访问http richelbilderbeek nl CppWtDeployGlobalHosted htm http richel
  • pyinstaller 是否有像 gcc -static 这样的参数?

    我有一个类似的问题 有没有办法将 Python 程序编译为二进制并将其与 Scratch Dockerfile 一起使用 https stackoverflow com questions 62581924 is there a way t
  • 在给定图上绘制水平线

    如何向现有绘图添加水平线 Use axhline https matplotlib org stable api as gen matplotlib pyplot axhline html 水平轴线 例如 这会在以下位置绘制一条水平线y 0
  • GUI 中的 __init__ 与 tkinter

    我正在学习使用 Tkinter 使用 python 创建简单的 GUI 我目前正在使用 python 文档作为参考 link http docs python org 2 library tkinter html 我想做的第一件事是理解那里