2009-08-18 7 views
2

У меня есть wx.Frame, в котором есть только один ребенок. При настройке wx.Sizer для ребенка я могу использовать флаг wx.SHAPED, который сохраняет соотношение сторон дочернего элемента. Тем не менее, Frame по-прежнему обладает полной свободой в своем соотношении сторон и оставляет пустое место в области, которая не используется ребенком.wxwidgets/wxPython: изменение размера wxFrame при сохранении пропорций

Как заблокировать соотношение сторон wx.Frame во время изменения размера?

ответ

5

Sizers нельзя применять к окнам верхнего уровня (для определения свойств самих окон, в отличие от их содержимого), поэтому, к сожалению, нет «истинного» способа блокировки соотношения сторон. Лучше всего поймать событиевашего окна, получить размер, который пользователь хочет получить в окне (который хранится в wxSizeEvent), рассчитать новую ширину и высоту в соответствии с соотношением сторон, а затем сразу вызвать SetSize с новый размер.

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

3

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

import wx 

class Frame(wx.Frame): 
    def __init__(self): 
     super(Frame, self).__init__(None, -1, 'Shaped Frame') 
     self.Bind(wx.EVT_SIZE, self.on_size) 
     self.panel = panel = wx.Panel(self, -1) 
     sizer = wx.BoxSizer(wx.VERTICAL) 
     sizer.Add(panel, 1, wx.SHAPED) 
     self.SetSizer(sizer) 
    def on_size(self, event): 
     event.Skip() 
     self.Layout() 
     self.panel.SetMinSize(self.panel.GetSize()) 
     self.Fit() 

if __name__ == '__main__': 
    app = wx.PySimpleApp() 
    frame = Frame() 
    frame.Show() 
    app.MainLoop() 
+1

Я предполагаю, что устранить мерцание невозможно. Событие OnSize всегда запускается после начала изменения размера, что означает вызов SetSize, когда событие будет получено после этого, всегда будет мерцать (это ограничение ОС, а не проблема с wx-спецификой). Кроме того, оконный фрейм (чертеж и функциональность) полностью контролируется ОС, поэтому нет возможности «переопределить» его, чтобы попытаться изменить его функциональность. – GRB

Смежные вопросы