LINUX.ORG.RU

Расширяемая ячейка

 , , ,


0

1

Пишу gui на python+tkinter. Использую grid - первая строка 2 ползунка и ttk.Label с картинкой, на второй строке полностью один ttk.Label с текстом. Можно ли повысить приоритет расширения у ячейки с картинкой, чтобы при изменении размера окна все остальные виджеты не меняли свой размер и оставались прижатыми к краям окна, а все изменения размера окна «поглощал» виджет с картинкой?

★★★★★

Последнее исправление: ados (всего исправлений: 1)

Использовать абсолютное позиционирование вместо относительного?

Virtuos86 ★★★★★
()

Не знаю как в python+tkinter, но в чистом Tcl/Tk это делается с помощью команд grid rowconfigure и grid columnconfigure с заданной опцией -weight. Строкам и колонкам, содержащим текст, устанавливается эта опция со значением 0, и тогда они не будут изменять свой размер. А строке и колонке, в которой находится картинка, ставится опция -weight 1.

anonymous
()
Ответ на: комментарий от anonymous
        tk.Grid.columnconfigure(self, 0, weight=0)
        tk.Grid.columnconfigure(self, 1, weight=0)
        tk.Grid.columnconfigure(self, 2, weight=1)
        tk.Grid.rowconfigure(self, 0, weight=1)
        tk.Grid.rowconfigure(self, 1, weight=0)

Что-то не пашет. В смысле программа молчит и виджеты ведут себя также как и раньше при изменении размера окна - виджеты прижимаются к картинке а не к краям окошка.

Мне это нужно чтобы при определённой команде посчитать доступный размер для картинки и реализовать зум.

ados ★★★★★
() автор топика
Последнее исправление: ados (всего исправлений: 1)
Ответ на: комментарий от ados

Я конечно понимаю что даже при отсутствии таких крутых примочек можно посчитать размер виджетов и самим всё посчитать. Но и тут у меня облом:

# В конце def __init__ (self ...
        print "Image's size: {} {}".format(self.panelB.winfo_width(),
                                           self.panelB.winfo_height())

При запуске:

$ python canny_research.py ../input/i2.tif 
Image's size: 1 1

Что есть полный неадекват.

ados ★★★★★
() автор топика
Ответ на: комментарий от ados

Если Вы запрашиваете размер виджета сразу же после его создания, то однопиксельный размер — это нормальный результат. Библиотека Tk рисует свои окна в отложенной манере, через цикл обработки событий. Если я правильно помню документацию, сначала виджет создаётся с начальный размером как раз в один пиксель, также сразу же в очередь событий ставится задача на изменение размера окна. В дальнейшем, когда программа будет бездельничать, запустятся обработчики событий, среди которых будут и те, что обрабатывают все накопившиеся запросы на изменение геометрии виджетов. Именно после этого виджеты на экране примут свои нормальные размеры, а запрос их размеров будет возвращать актуальную величину.

В Вашем случае нужно создать весь интерфейс, прерваться на несколько миллисекунд (уж не знаю, как это в питоне делается), чтобы интерфейс успел сформироваться, и только тогда запрашивать размеры виджета.

anonymous
()
Ответ на: комментарий от ados

weight определяет, кто кого вытесняет.

К примеру, если у нас есть панель и два скролла, которые должны лепится справа и снизу, то для ячейки с панелью (0, 0) ставим вес 1 и липкость NESW (т. е. лезть во все стороны), а для скроллов - вес 0 и NES (0, 1) и ESW (1, 0) соответственно.

Кстати, почему «sticky=tk.W+tk.S»? У меня «sticky='NESW'» работает.

vsemnazlo
()
Ответ на: комментарий от vsemnazlo

Да это наверно именно то что я ищу, но в теории. На практике же у меня что без этих инструкций Grid.columnconfigure(..., weight=...) и widget.grid(..., sticky='...') что с ними - результат тот же. Поэтому у меня и сомнения в назначении этих инструкций.

Попробовал поменять значения опций sticky:

...
        scale1.grid(column=0, row=0, sticky='SNW')
        scale2.grid(column=1, row=0, sticky='SNW')
...
        lab.grid(row=1, column=0, columnspan=3, sticky='WES')
...
            panelB.grid(column=2, row=0, sticky='NESW')
...

Результат тот же.

http://i3.imgchili.net/104908/104908808_window.png

http://i3.imgchili.net/104908/104908902_window_expanded.png

ados ★★★★★
() автор топика
Ответ на: комментарий от vsemnazlo

Решил проблему

В __init__ этого App:

        root = self._nametowidget('.')
        tk.Grid.rowconfigure(root, 0, weight=1)
        tk.Grid.columnconfigure(root, 0, weight=1)

+ ещё опция sticky у App: self.grid(row=0, column=0, sticky=«NESW»)

Спасибо тебе за помощь.

ados ★★★★★
() автор топика
Последнее исправление: ados (всего исправлений: 1)
Ответ на: Решил проблему от ados

Хотя я ещё плохо понимаю Tkinter. Наверно лучше так:

        ...
        root = self._nametowidget(self.winfo_parent())
        ...
ados ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.