wxpython GridBagSizer内部wx.滚动窗口在Microsoft Windows中将框架捕捉到屏幕的一侧时未正确调整大小

2024-09-30 08:27:56 发布

您现在位置:Python中文网/ 问答频道 /正文

编辑:这似乎只发生在微软Windows7Pro和微软Windows7Home中。这在ubuntu10.04中没有发生。在

下面是我遇到的问题的一些示例代码:

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()

如果不刷新EVT_SIZE,则会导致某些小部件绘制错误。下面是它的一个示例(http://i.stack.imgur.com/tYEF4.png)。在

如果对EVT_SIZE添加刷新,它将修复大多数大小问题,除非在MS Windows中将帧捕捉到屏幕的一半。下面是一个看起来像(http://i.stack.imgur.com/UKTPi.png)的示例。在

我不明白为什么它总是画不正确的右下面板。它看起来像是从面板的底部而不是顶部绘制的。如果你重新调整框架的大小,它会正确地重新绘制它,并给你预期的行为。在

看起来growtablecolumn导致了这个问题,但我似乎无法修复它并保持我想要的行为。我试过打电话self.bottomrightPanel.Layout()调整大小,但这似乎没有任何作用。我也试过打电话self.bottomrightPanel.Fit()on resize,它修复了当你将框架捕捉到屏幕的一半时出现的问题,但它会破坏主面板的外观(这会导致它看起来非常糟糕)。如果有人知道如何解决这个问题(不改变我在当前应用程序中已经做过的尺寸调整器类型),我将非常感激。在


Tags: textselfaddnumparentwxwhitepanel
1条回答
网友
1楼 · 发布于 2024-09-30 08:27:56

我现在也有类似的问题。我把范围缩小到wx.滚动窗口. 如果你能把它改成wx.面板它可能会解决问题。我还在考虑修复滚动窗口的问题。在

相关问题 更多 >

    热门问题