WxPython升级2.8到2.9 GUI问题

时间:2015-07-23 14:18:23

标签: python wxpython

Python 2.7

我们正在尝试从Wx 2.8升级到2.9。我们遇到的问题是新版本中旧代码的行为不再相同。我准备了一个小例子来证明这个问题。我认为问题源于我们的一个小组中的几行代码:

self.SetSize((-1, 55))
self.SetMinSize(self.GetSize())
self.SetMaxSize(self.GetSize())

也许有人遇到过这个问题并找到了实现上述结果的不同方法?调用GetSize时,宽度在新版本的Wx上返回20像素。

WxPython 2.8.12.1

enter image description here

WxPython 2.9.5.0

enter image description here

以下是一个示例程序,其行为与我所述:

import wx

class OperatorPanel(wx.Panel):
    def __init__(self, parent):
        wx.Panel.__init__(self, parent)

        self.__operatorCombo = OperatorCombo(self)

        borderBox = wx.StaticBox(self, -1, "Operator")
        hbox = wx.StaticBoxSizer(borderBox, wx.VERTICAL)
        hbox.Add(self.__operatorCombo, flag=wx.EXPAND | wx.LEFT | wx.RIGHT, border=5)
        self.SetSizer(hbox)
        self.SetSize((-1, 55))
        self.SetMinSize(self.GetSize())
        self.SetMaxSize(self.GetSize())

class OperatorCombo(wx.Panel):
    def __init__(self, parent):
        wx.Panel.__init__(self, parent)
        self.__comboBox = wx.ComboBox(self, style=wx.CB_READONLY)
        self.__btnAdd = wx.Button(self, label='...', size=(20, -1))
        hsizer = wx.BoxSizer(wx.HORIZONTAL)
        hsizer.Add(self.__comboBox, 5, flag=wx.EXPAND)
        hsizer.Add(self.__btnAdd, 1)
        self.SetSizer(hsizer)

class TestApp(wx.Dialog):
    def __init__(self, parent):
        wx.Dialog.__init__(self, parent, style=wx.DEFAULT_DIALOG_STYLE | wx.RESIZE_BORDER)

        self.SetSize((350, 300))

        self.__panTop = wx.Panel(self)
        self.__panBottom = wx.Panel(self)

        self.__panOperator1 = OperatorPanel(self.__panTop)
        self.__panOperator2 = OperatorPanel(self.__panTop)

        self.__btnTest = wx.Button(self.__panBottom, -1, "Test", wx.DefaultPosition, wx.DefaultSize, 0)
        testSizer = wx.BoxSizer(wx.HORIZONTAL)
        testSizer.Add(self.__btnTest, 0, flag=wx.EXPAND)
        self.__panBottom.SetSizer(testSizer)

        vbox = wx.BoxSizer(wx.VERTICAL)
        hbox = wx.BoxSizer(wx.HORIZONTAL)

        hbox.Add(self.__panOperator1, 1, flag=wx.EXPAND)
        hbox.AddSpacer(5)
        hbox.Add(self.__panOperator2, 1, flag=wx.EXPAND)
        vbox.Add(hbox, flag=wx.EXPAND)

        self.__panTop.SetSizer(vbox)

        vsizer = wx.BoxSizer(wx.VERTICAL)
        vsizer.Add(self.__panTop, 1, flag=wx.EXPAND | wx.LEFT | wx.RIGHT, border=3)
        vsizer.AddSpacer(5)
        vsizer.Add(self.__panBottom, 1, flag=wx.EXPAND | wx.LEFT | wx.RIGHT, border=3)
        # Add more stuff here

        self.SetSizer(vsizer)

app = wx.App()
dlg = TestApp(None)
dlg.ShowModal()
dlg.Destroy()

如果删除这三行,它会表现正常,但控件垂直太大。

感谢。

1 个答案:

答案 0 :(得分:0)

它与StaticBoxSizer有关,由于某种原因它没有/得到正确的大小。

我找到的解决方法是用以下内容替换这三行:

    self.SetSize((-1, 55))
    self.Layout()

    wx.CallAfter(self.mySetSize)

def myPrint(self):
    print('myPrint')
    print(self.GetSize())

def mySetSize(self):
    print('myGetSize')
    self.myPrint()
    self.SetMinSize(self.GetSize())
    self.SetMaxSize(self.GetSize())

印刷品显然只是用于调试。

顺便说一句,你为什么不升级到3.0.2,甚至可能升到wxPython-Phoenix?

2.9.5不会得到任何修正,3.0.2有一些修正,从未进入2.9.5。