2013-06-28 3 views
0

У меня есть tvtk SceneEditor для сцены mayavi в моем приложении traitsui. При определении этого редактора я попросил его иметь размер 500x500.Текущий размер редактора traitsui

Из панели инструментов MayaVi, редактор сцены сам понимает, что он имеет меньший размер, чем это при нормальных условиях:

>>> self.scene.scene_editor.get_size() 
wx.Size(500, 468) 

И когда окно увеличивается так, что редактор занимает гораздо больше места, он понимает это слишком

>>> self.scene.scene_editor.get_size() 
wx.Size(500, 781) 

Однако, если редактор сделал гораздо меньше, он отказывается занимать меньше места (даже если содержимое может быть легко пересчитаны), потому что редактор был указан занять 500x500. Он позволяет изменять размер редактора, но просто отсекает часть дисплея, пока он не будет увеличен снова.

Я хочу знать, есть ли способ: а) спросить, какая часть редактора в настоящее время отображается на экране (вместо минимального размера, который редактор хочет отобразить) и b) сделать редактор по умолчанию 500x500 но будьте готовы просить его содержимое перемасштабировать, если оно будет уменьшено.

Я использую wxpython backend.

Редактировать: Важно также, чтобы сцена содержалась в группе layout='split' - после изучения этого вопроса и столкновения с огромным количеством sizers, которые wx генерирует при добавлении виджета traitsui, я понял, что это может иметь значение.

ответ

0

После взлома на несколько дней у меня есть ответ на часть а) (хотя он хакерский и не обязательно общего назначения, и он может быть специфичным для макета layout='split').

self.scene.scene_editor.control.Parent.Parent.Size описывает размер окна просмотра, в котором отображается редактор, по крайней мере, с layout='split', но я легко могу представить, что он был бы другим для других типов макета (который я не тестировал).

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

Более окровавленные детали:

Дробильные, связанный с self.scene.scene_editor.control не является правильной, вероятно, потому, что Sizer относится к окну, содержащему редактор, в то время как Sizer, связанному с размером окна в пределах содержащего разветвителя виджета разрешено «закрывать» это окно и игнорировать его размер.

Я узнал, что процесс добавления виджета traitsui определяет так много ящиков (при условии нетривиального количества виджетов), что приводит к огромному избытку wx Windows со связанными с ними wx Sizer, которые зависят от их дочерних виджетов, чтобы определить текущий размер, поэтому очень сложно управлять такими вещами. Вероятно, поэтому существует энальм; так что эти ограничения могут быть явно указаны пользователем. Может быть, когда-нибудь я конвертирую свою программу для использования enaml, но это похоже на много усилий для того, что в настоящее время работает очень хорошо.

У меня все еще нет ответа на часть b), поэтому я оставляю этот вопрос открытым. Было бы неплохо, если бы был способ указать при строительстве беспорядок wx sizers, который разрешает изменение размера этого окна ниже его начального размера, но, вероятно, нет.