Установите максимальную ширину для фрейма с помощью ScrolledWindow в wxPython

Я создал объект Frame и хочу ограничить ширину, до которой он может расширяться. Единственное окно в кадре — это объект ScrolledWindow, который содержит все остальные дочерние элементы. У меня есть много объектов, расположенных с вертикальной ориентацией BoxSizer, поэтому объект ScrolledWindow становится довольно высоким. Часто справа есть полоса прокрутки, чтобы вы могли прокручивать вверх и вниз.

Проблема возникает, когда я пытаюсь установить максимальный размер кадра. Я использую функции scrolled_window.GetBestSize() (или scrolled_window.GetEffectiveMinSize()) ScrolledWindow, но они не учитывают вертикальную полосу прокрутки. В итоге у меня есть рамка, которая слишком узкая, и есть горизонтальная полоса прокрутки, которая никогда не исчезнет.

Есть ли метод, который будет компенсировать ширину вертикальной полосы прокрутки? Если нет, то как мне получить ширину полосы прокрутки, чтобы я мог вручную добавить ее к максимальному размеру моего фрейма?

Вот пример с высокой, но узкой рамой:

class TallFrame(wx.Frame):
  def __init__(self):
    wx.Frame.__init__(self, parent=None, title='Tall Frame')
    self.scroll = wx.ScrolledWindow(parent=self) # our scroll area where we'll put everything
    scroll_sizer = wx.BoxSizer(wx.VERTICAL)

    # Fill the scroll area with something...
    for i in xrange(10):
      textbox = wx.StaticText(self.scroll, -1, "%d) Some random text" % i, size=(400, 100))
      scroll_sizer.Add(textbox, 0, wx.EXPAND)
    self.scroll.SetSizer(scroll_sizer)
    self.scroll.Fit()

    width, height = self.scroll.GetBestSize()
    self.SetMaxSize((width, -1)) # Trying to limit the width of our frame
    self.scroll.SetScrollbars(1, 1, width, height) # throwing up some scrollbars

Если вы создадите этот кадр, вы увидите, что self.SetMaxSize установлен слишком узко. Всегда будет горизонтальная полоса прокрутки, поскольку self.scroll.GetBestSize() не учитывает ширину полосы прокрутки.


person Cristian    schedule 03.09.2009    source источник
comment
Мне интересно, но я не знаю ни проблемы, ни ответа. Не могли бы вы опубликовать небольшой пример кода, иллюстрирующий суть?   -  person tom10    schedule 04.09.2009
comment
Спасибо за публикацию кода. Я вижу проблему и немного поиграл с ней, но не понял. Наверняка кто-то из пользователей wxPython или wx-users знает. (Одна вещь, которая мне любопытна, это то, что вы устанавливаете все свои размеры, прежде чем добавлять полосу прокрутки.)   -  person tom10    schedule 08.09.2009
comment
зачем устанавливать максимальный размер? Что плохого в том, чтобы позволить конечному пользователю сделать ваше приложение действительно большим?   -  person Bryan Oakley    schedule 07.01.2010


Ответы (1)


Это немного некрасиво, но, похоже, работает в Windows и Linux. Однако есть разница. Кажется, что self.GetVirtualSize() возвращает разные значения на каждой платформе. Во всяком случае, я думаю, что это может помочь вам.

width, height = self.scroll.GetBestSize()
width_2, height_2 = self.GetVirtualSize()
print width
print width_2
dx = wx.SystemSettings_GetMetric(wx.SYS_VSCROLL_X)
print dx
self.SetMaxSize((width + (width - width_2) + dx, -1)) # Trying to limit the width of our frame
self.scroll.SetScrollbars(1, 1, width, height) # throwing up some scrollbars
person NobodyReally    schedule 03.11.2009