Разница между .pack и .configure для виджетов в TkInter? - PullRequest
3 голосов
/ 03 января 2012

В настоящее время я изучаю текст, чтобы попытаться больше узнать о 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?Что означает «словарь кнопки»?

Ответы [ 2 ]

2 голосов
/ 04 января 2012

Атрибут объектов Tkinter не обрабатывается с помощью механизма атрибутов python (т.е. вы можете не делать 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: grid и place, для сравнения см. этот ответ .

2 голосов
/ 03 января 2012

Каждый виджет имеет словарь атрибутов (text, background, ...).Вы можете получить к нему доступ с помощью обычного синтаксиса словаря, как в self.button1["text"] = "Hello, World!" или с помощью метода configure, который вы видите в других примерах.Это просто для настройки внешнего вида и поведения виджета.

Как только вы закончите, вы вызываете pack, чтобы позволить Tkinter теперь, когда виджет готов к использованию.Затем он будет отображен и т. Д.

Это можно увидеть, выполнив команды Tkinter шаг за шагом в интерпретаторе, например:

>>> from Tkinter import *
>>> root = Tk()
>>> bt = Button(root)
>>> bt['text'] = 'hello'
>>> bt.pack()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...