2016-04-20 1 views
0

Добрый вечер/утро,WxPython GridBagSizer внутри ScrolledWindow не работает

я работал над программой и поняли, что на низких разрешениях, большая часть программы получает отрезаны. Чтобы противодействовать этому, я решил добавить scrolledwindow в GUI. Оглядевшись, я нашел этот пример:

import wx as wx 

class MainFrame(wx.Frame): 
    def __init__(self, *args, **kwargs): 
     wx.Frame.__init__(self, *args, **kwargs) 

     #Panel that holds all the other panels 
     self.mainPanel = wx.ScrolledWindow(self, -1) 
     self.mainPanel.SetScrollbars(1, 1, 1, 1) 
     self.mainPanel.SetBackgroundColour("LIGHT GREY") 

     #Panels in mainPanel 
     self.lefttopPanel = wx.Panel(self.mainPanel, -1) 
     self.lefttopPanel.SetBackgroundColour("WHITE")   
     self.sizewidgets(self.panelwidgets(
         text='Left Top Panel', 
         num=12, 
         parent=self.lefttopPanel), 
         parent=self.lefttopPanel)   

     self.leftmiddlePanel = wx.Panel(self.mainPanel, -1) 
     self.leftmiddlePanel.SetBackgroundColour("WHITE")   
     self.sizewidgets(self.panelwidgets(
         text='Left Middle Panel', 
         num=6, 
         parent=self.leftmiddlePanel), 
         parent=self.leftmiddlePanel) 

     self.leftbottomPanel = wx.Panel(self.mainPanel, -1) 
     self.leftbottomPanel.SetBackgroundColour("WHITE") 
     self.sizewidgets(self.panelwidgets(
         text='Left Bottom Panel', 
         num=8, 
         parent=self.leftbottomPanel), 
         parent=self.leftbottomPanel) 

     self.righttopPanel = wx.Panel(self.mainPanel, -1) 
     self.righttopPanel.SetBackgroundColour("WHITE")   
     self.sizewidgets(self.panelwidgets(
         text='Right Top Panel', 
         num=8, 
         parent=self.righttopPanel), 
         parent=self.righttopPanel) 

     self.rightbottomPanel = wx.Panel(self.mainPanel, -1) 
     self.rightbottomPanel.SetBackgroundColour("WHITE") 
     self.sizewidgets(self.panelwidgets(
         text='Right Bottom Panel', 
         num=8, 
         parent=self.rightbottomPanel), 
         parent=self.rightbottomPanel) 


     mpsizer = wx.GridBagSizer(vgap=4, hgap=4) 
     mpsizer.Add(self.lefttopPanel, pos=(0,0), span=(1,1), flag=wx.EXPAND) 
     mpsizer.Add(self.leftmiddlePanel, pos=(1,0), span=(1,1), flag=wx.EXPAND) 
     mpsizer.Add(self.leftbottomPanel, pos=(2,0), span=(1,2), flag=wx.EXPAND) 
     mpsizer.Add(self.righttopPanel, pos=(0,1), span=(2,2), flag=wx.EXPAND) 
     mpsizer.Add(self.rightbottomPanel, pos=(2,2), span=(1,1), flag=wx.EXPAND) 
     mpsizer.AddGrowableCol(1) 
     mpsizer.AddGrowableRow(1) 
     self.mainPanel.SetSizer(mpsizer) 

     #Adding a refresh to resize event 
     self.Bind(wx.EVT_SIZE, self.OnResize) 

     self.Show() 

    def OnResize(self, event): 
     self.Refresh() 
     event.Skip() 

    def sizewidgets(self, widgetlist , parent): 
     psizer = wx.GridSizer(cols=2, vgap=5,hgap=5) 
     for widget in widgetlist: 
      psizer.Add(widget) 
     parent.SetSizer(psizer) 



    def panelwidgets(self, text, num, parent): 
     widgets = [] 
     for i in range(num): 
      widgets += [wx.StaticText(parent, label=text)] 
     return widgets 

if __name__ == "__main__": 
    app = wx.App() 
    MainFrame(None, size=(800, 800), title="GridBagSizer Problem") 
    app.MainLoop() 

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

import wx as wx 

class MainFrame(wx.Frame): 
    def __init__(self, *args, **kwargs): 
     wx.Frame.__init__(self, *args, **kwargs) 

     #Panel that holds all the other panels 
     self.mainPanel = wx.ScrolledWindow(self, -1) 
     self.mainPanel.SetScrollbars(1, 1, 1, 1) 
     self.mainPanel.SetBackgroundColour("LIGHT GREY") 

    # 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 

     sizer = wx.GridBagSizer() 
    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) 

    sizer.AddGrowableRow(1) 
    sizer.AddGrowableCol(1) 
     self.mainPanel.SetSizer(sizer) 

     #Adding a refresh to resize event 
     self.Bind(wx.EVT_SIZE, self.OnResize) 

     self.Show() 

    def OnResize(self, event): 
     self.Refresh() 
     event.Skip() 

    def sizewidgets(self, widgetlist , parent): 
     psizer = wx.GridSizer(cols=2, vgap=5,hgap=5) 
     for widget in widgetlist: 
      psizer.Add(widget) 
     parent.SetSizer(psizer) 



    def panelwidgets(self, text, num, parent): 
     widgets = [] 
     for i in range(num): 
      widgets += [wx.StaticText(parent, label=text)] 
     return widgets 

if __name__ == "__main__": 
    app = wx.App() 
    MainFrame(None, size=(800, 800), title="GridBagSizer Problem") 
    app.MainLoop() 

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

ответ

0

Дочерние виджеты, которые создаются

self.label = wx.StaticText(self, -1, text, wx.DefaultPosition, wx.DefaultSize) 

имеют себя в качестве родителя, который является классом MainFrame.

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

self.label = wx.StaticText(self.mainPanel, -1, text, wx.DefaultPosition, wx.DefaultSize) 
+0

я на самом деле понял это тоже, прежде чем проверять обратно на это, ха-ха. Спасибо хоть! –