【问题标题】:Difference between .pack and .configure for widgets in TkInter?TkInter中小部件的.pack和.configure之间的区别?
【发布时间】:2012-01-03 01:35:22
【问题描述】:

我目前正在学习一本书,以尝试更多地了解 TkInter,因为我正在尝试改进我的 Python 3 编程。如有必要,可在此处找到文本:http://www.ferg.org/thinking_in_tkinter/all_programs.html

在标记为“tt040.py”的部分有一个示例代码,其中一部分是:

    self.button1 = Button(self.myContainer1)
    self.button1["text"] = "Hello, World!"   ### (1)
    self.button1["background"] = "green"     ### (1)
    self.button1.pack()


    self.button2 = Button(self.myContainer1)
    self.button2.configure(text="Off to join the circus!") ### (2)
    self.button2.configure(background="tan")               ### (2)
    self.button2.pack()


    self.button3 = Button(self.myContainer1)
    self.button3.configure(text="Join me?", background="cyan")  ### (3)
    self.button3.pack()

这部分代码的解释是:

"(2)对于button2,过程与button1基本相同,但我们不是访问按钮的字典,而是使用按钮内置的“configure”方法。

(3) 对于button3,我们看到configure方法可以接受多个关键字参数,所以我们可以在一个语句中设置多个选项。”

解释的真正含义是什么?如,实际区别是什么(使用 .pack)或需要 .configure 方法? “按钮的字典”是什么意思?

【问题讨论】:

    标签: python methods tkinter


    【解决方案1】:

    Tkinter 对象属性不是通过python 属性机制处理的(即你可以not self.button1.text = "hello")。相反,tkinter 提供了两种方法来改变这个属性:

    • 将对象用作字典:self.button1["text"] = "hello"
    • 使用带有命名参数的config 方法:self.button1.config(text="hello")

    两者是等价的。请注意,您还可以通过名为参数的构造函数传递这样的初始化值,以便一步执行实例化和初始化:self.button1 = Button(self.myContainer1, text="hello")

    pack 服务于完全不同的目的。这是一个几何管理指令。不带参数使用 button1.pack() 要求将 button1 放置在其父窗口小部件中,低于先例兄弟(如果有)。您可以使用options 指定相对位置,或调整行为大小。

    tkinter 还有其他几何管理器:网格和位置,比较见this response

    【讨论】:

    • 你是否知道没有选择属性机制的原因?在 Python 1.x 中首次添加 Tkinter 时,__setattr__ 方法和朋友是否根本不存在?还是有意识地决定使用__setitem__ 会更好?我目前正在查看是否有讨论过此问题的旧 PEP 或邮件列表,但我没有找到任何东西。
    【解决方案2】:

    每个小部件都有一个属性字典(textbackground、...)。您可以使用常规字典语法访问它,如self.button1["text"] = "Hello, World!" 或使用您在其他示例中看到的configure 方法。这只是为了设置小部件的外观和行为。

    一旦你完成了,你打电话给pack 让Tkinter 现在小部件已经准备好使用了。然后会显示等等。

    你可以通过在解释器中逐步执行Tkinter命令来看到这一点,像这样:

    >>> from Tkinter import *
    >>> root = Tk()
    >>> bt = Button(root)
    >>> bt['text'] = 'hello'
    >>> bt.pack()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-07-24
      • 2019-06-28
      • 2015-03-21
      • 2020-01-17
      • 2014-05-11
      • 1970-01-01
      • 2023-03-03
      • 2021-02-17
      相关资源
      最近更新 更多