Уведомления

Группа в Telegram: @pythonsu
  • Начало
  • » GUI
  • » кроссплатформенный вопрос по tkinter [RSS Feed]

#1 Апрель 22, 2015 10:17:28

SirJorah
Зарегистрирован: 2015-04-21
Сообщения: 41
Репутация: +  2  -
Профиль   Отправить e-mail  

кроссплатформенный вопрос по tkinter

Уважаемые коллеги! В процессе ваяния небольшого GUI на tkinter (именно tkinter, поскольку он включен в windows-установку python по дефолту и гораздо проще сказать пользователю “установи питон”, чем “установи питон, а потом…”) столкнулся с проблемой. Как известно, в tkinter размеры виджетов, содержащих текст, измеряются в неких странных попугаях, именуемых “знакоместо”. Следовательно, одно знакоместо при кегле шрифта 8 совсем не то же самое, что при кегле 14. Но это ладно, собирая GUI под линуксом, я все выровнял и аккуратно подогнал кнопочки (button) к строкам ввода (entry). Но стоило запустить файлик под проклятыми форточками, как все виджеты весело разъехались как попало: entry стали длиннее, а кнопки размером в 1 знакоместо стали совсем крохотными. Упаковывал все это безобразие упаковщиком place. Буду признателен за дельный совет, каким образом сохранить неизменный вид GUI при переносе с платформы на платформу.

Офлайн

#2 Апрель 22, 2015 17:10:27

4kpt_III
Зарегистрирован: 2014-12-22
Сообщения: 999
Репутация: +  39  -
Профиль   Отправить e-mail  

кроссплатформенный вопрос по tkinter

Потому как использовали менеджер геометрии объектов .place, который использовать никак нельзя. Точнее можно, но только для очень (ключевое слово “очень”) специфических задач. Размеры некоторых виджетов действительно задаются в знакоместах, однако их реальный размер можно все же получить и подкорректировать, если надо. Хотя это неверный путь. Лучше использовать отступы и растяжения. Заодно и к html - css подготовитесь.

Офлайн

#3 Апрель 22, 2015 22:53:28

SirJorah
Зарегистрирован: 2015-04-21
Сообщения: 41
Репутация: +  2  -
Профиль   Отправить e-mail  

кроссплатформенный вопрос по tkinter

Спасибо, уважаемый друг! Совет по делу и Вашу мысль по поводу place я кажется понял. К сожалению, привычка размещать элементы с точной привязкой по x и y - это тяжелый груз многолетнего “сидения” в Delphi (предвижу град камней в свой адрес - и поделом, ибо кто остановился, тот до цели уже не дойдет). Так что будем колдовать с отступами, растяжениями, может упаковщик grid поможет чем-нибудь. Еще раз спасибо!

Офлайн

#4 Апрель 22, 2015 23:49:36

4kpt_III
Зарегистрирован: 2014-12-22
Сообщения: 999
Репутация: +  39  -
Профиль   Отправить e-mail  

кроссплатформенный вопрос по tkinter

Аналогично было. Сам оттуда. Первый проект напилил только с place. Потом для при изменении экрана проводил серьезные расчеты и переделывал размещения. Короче. Занимался всякой лабуденью. Кроме grid можно смело смотреть pack(). grid используется тогда, когда уж очень табличное размещение и множество элементов. place - для более адаптивной верстки. Но вот при его использовании чаще приходится пользоваться рамками. И одно “но”. Не забывайте, что для виджетов одного уровня можно использовать только один менеджер геометрии!!! Для разграничения менеджеров можно применять рамку (frame).

Офлайн

#5 Апрель 23, 2015 08:46:00

SirJorah
Зарегистрирован: 2015-04-21
Сообщения: 41
Репутация: +  2  -
Профиль   Отправить e-mail  

кроссплатформенный вопрос по tkinter

Да, это верно - в одном фрейме разные менеджеры применять нельзя, об этом многие авторы мануалов пишут. Почему-то Джон Шипман из New Mexico Computer Center в Tkinter 8.5 reference рассматривает только grid, подчеркивая, что он его “strongly prefers”. Видимо, его личное мнение. Я как раз нижний фрейм данной программулины собрал pack`ом и получилось недурственно. Буду перебирать верхний. Ваши рекомендации ценны, еще раз благодарю.

Офлайн

#6 Апрель 23, 2015 11:20:30

SirJorah
Зарегистрирован: 2015-04-21
Сообщения: 41
Репутация: +  2  -
Профиль   Отправить e-mail  

кроссплатформенный вопрос по tkinter

Получилось, собрал верхний фрейм pack'ом, правда пришлось добавить два под-фрейма, по одному для каждой “строки” компонентов. А для компенсации разницы между начертанием шрифтов на каждой платформе применил мощное “колдунство” sys.platform и задал добавки к width и ipadx для “форточного” случая. Конечно, есть еще платформа darwin, тоже активно пользуемая широким кругом лиц, но как это будет выглядеть там, пока одному Стиву Джобсу ведомо.

Прикреплённый файлы:
attachment lin_win.png (41,7 KБ)

Офлайн

#7 Апрель 23, 2015 17:34:06

4kpt_III
Зарегистрирован: 2014-12-22
Сообщения: 999
Репутация: +  39  -
Профиль   Отправить e-mail  

кроссплатформенный вопрос по tkinter

Нормально. Только вот зафиксируйте размер базового окна или подумайте как можно динамически изменять.

Офлайн

#8 Апрель 23, 2015 23:35:29

SirJorah
Зарегистрирован: 2015-04-21
Сообщения: 41
Репутация: +  2  -
Профиль   Отправить e-mail  

кроссплатформенный вопрос по tkinter

Точно подметили - зафиксировать. Я с самого начала так и записал:

root=Tk()
root.title('Импорт XML Росреестра')
root.geometry('480x280')
root.resizable(False, False)
Размер окна небольшой, даже на VGA экран поместится. Динамически изменять уметь надо, но применять не в этой программе, которая запускается не более чем на минуту для быстрой обработки указанных файлов. Более интересна сама обработка, в пакетном режиме для каждого xml-файла будет создаваться отдельный поток и произвольное количество файлов будет парситься одновременно. Успел оценить удобство функции path.walk для создания списка файлов начиная от стартового пути по всем вложенным директориям. В Делфе для подобных целей городил страшные рекурсивные конструкции. Здесь внутри самой walk тоже конечно же сидит рекурсия, но насколько же читабельнее и проще конечный код!

Офлайн

  • Начало
  • » GUI
  • » кроссплатформенный вопрос по tkinter[RSS Feed]

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version