Приложение wxpython исчезает с экрана при более низких разрешениях

Добрый вечер/утро,

Я работал над прилично углубленной программой на моем мониторе 1920x1080. Я настроил все, чтобы поместиться на моем мониторе, когда он развернут. У меня есть несколько проблем, которые, как я думаю, связаны с тем, как я настроил свои сайзеры.

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

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

import wx

class simpleapp_wx(wx.Frame):
    def __init__(self,parent,id,title):
        wx.Frame.__init__(self,parent,id,title,(-1,-1))
        self.parent = parent
        self.initialize()

    """ Create All of the pieces for the GUI """
    def initialize(self):
        sizer = wx.GridBagSizer()
        panel = wx.Panel(self)

        # Handles the creation of all of the buttons
        def make_button(text, starty, startx, height, width):
            button = wx.Button(self, -1, text)
            sizer.Add(button, (starty, startx), (height, width), wx.EXPAND)
            return button

        # Handles the c reation of all of the static text labels
        def make_label(text, starty, startx, height, width):
            self.label = wx.StaticText(self, -1, text, wx.DefaultPosition, wx.DefaultSize)
            sizer.Add(self.label, (starty, startx), (height, width), wx.EXPAND)
            return self.label

        # Create all of the labels for each slot and buttons
        for i in range(0, 4):
            # all the labels
            make_label('Voltage', 7, i*5, 1, 1)
            make_label('Current', 8, i*5, 1, 1)
            make_label('Power', 9, i*5, 1, 1)
            make_label('Rail 1', 6, (i*5)+1, 1, 1)
            make_label('Rail 2', 6, (i*5)+2, 1, 1)
            make_label('Rail 3', 6, (i*5)+3, 1, 1)
            make_label('Total Power', 6, (i*5)+4, 1, 1)
            make_label('Status:', 14, (i*5), 1, 1)
            # Global Rail commands for all 4 slots
            make_button("Margin Low", 1, (i*5)+2, 1, 1)
            make_button("Margin High", 1, (i*5)+3, 1, 1)
            make_button("Margin Off", 1, (i*5)+4, 1, 1)
            # Rail 1 for all 4 slots
            make_button("Margin High", 11, (i*5)+1, 1, 1)
            make_button("Margin Low", 12, (i*5)+1, 1, 1)
            make_button("Margin Off",  13, (i*5)+1, 1, 1)
            # Rail 2 for all 4 slots
            make_button("Margin High",  11, (i*5)+2, 1, 1)
            make_button("Margin Low", 12, (i*5)+2, 1, 1)
            make_button("Margin Off", 13, (i*5)+2, 1, 1)
            # Rail 3 for all 4 slots
            make_button("Margin High",  11, (i*5)+3, 1, 1)
            make_button("Margin Low",  12, (i*5)+3, 1, 1)
            make_button("Margin Off",  13, (i*5)+3, 1, 1)
            # Create the Configure buttons for each slot (only needs to run three times so needs if statement
            if i < 3:
                # Make the Configure buttons for Slot 1
                make_button("Configure",  10, i+1, 1 ,1)
                # Make the Configure buttons for Slot 2
                make_button("Configure",  10, i+6, 1, 1)
                # Make the Configure buttons for Slot 3
                make_button("Configure",  10, i+11, 1, 1)
                # Make the Configure buttons for Slot 4
                make_button("Configure",  10, i+16, 1, 1)

        self.SetSizerAndFit(sizer)
        self.SetSizeHints(-1,-1)
        self.Show(True)
        self.Maximize(True)

if __name__ == "__main__":
    app = wx.App()
    frame = simpleapp_wx(None,-1,'Add-in Card GUI')
    app.MainLoop()

Я читал, и я где-то читал о размещении gridbagsizer в панели, и это должно работать, поэтому мой измененный заголовок и ближе были:

    sizer = wx.GridBagSizer()
    panel = wx.Panel(self)

    panel.SetSizer(sizer)
    panel.Fit()
    self.Fit()
    self.Show(True)
    self.Maximize(True)

Это тоже ничего не изменило. Я пытался установить SetSizeHints для определенных разрешений, но это тоже не сработало.

Итак, что вызывает эту проблему? У меня есть ощущение, что это как-то связано со мной, когда я использую один размер для всего содержимого. Если это так, как мне проще всего исправить это без необходимости полностью реконструировать новые сайзеры и разбивать содержимое?


person Trever Wagenhals    schedule 13.04.2016    source источник
comment
Не могли бы вы создать небольшой работающий пример, демонстрирующий проблему?   -  person Mike Driscoll    schedule 13.04.2016
comment
Выложил небольшой рабочий пример. Извините за отступ, хотя, я не мог на всю жизнь сделать это правильно. Физически он выглядит правильно в стеке, но по какой-то причине, когда я копирую его в gedit, он портится, так что просто следите за этим. Пример находится в первом текстовом поле выше и заменил мой старый.   -  person Trever Wagenhals    schedule 13.04.2016
comment
Я не уверен, как вы хотите, чтобы он вел себя в меньшем пространстве, но вы можете использовать scrolledpanel. panel = wx.lib.scrolledpanel.ScrolledPanel(self) panel.SetupScrolling()   -  person Selçuk Cihan    schedule 14.04.2016
comment
Я согласен с @SelçukCihan. Я бы просто использовал ScrolledPanel для этого. Есть так много виджетов, я не уверен, что он сможет изменить их размер таким образом, чтобы их можно было использовать.   -  person Mike Driscoll    schedule 14.04.2016


Ответы (1)


Вам нужно пометить столбцы и строки сайзера как расширяемые:

...
for i in range(0, 20):
    sizer.AddGrowableCol(i, 1)
for i in range(0, 15):
    sizer.AddGrowableRow(i, 1)

self.SetSizerAndFit(sizer)
...

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

По крайней мере, для wxPython>=3 вам нужно убедиться, что вы пытаетесь сделать строку или столбец расширяемыми, только если они существуют.

person Jay Kominek    schedule 21.04.2016