WxPython 升级 2.8 到 2.9 GUI 问题

WxPython upgrading 2.8 to 2.9 GUI issue

Python 2.7

我们正在尝试从 Wx 2.8 升级到 2.9。我们 运行 遇到了旧代码在新版本中的行为不再相同的问题。我准备了一个小例子来演示这个问题。我认为问题出在我们的一个面板中的几行代码:

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

也许有人 运行 解决了这个问题并找到了实现上述结果的不同方法?调用GetSize时,宽度returns在新版Wx上为20像素

WxPython 2.8.12.1

宽xPython 2.9.5.0

.

这是一个示例程序,它的行为与我描述的一样:

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

如果删除这三行,它会正常运行,但控件在垂直方向上太大。

谢谢。

它与 StaticBoxSizer 有关,由于某些原因它 have/get 尺寸不正确。

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

    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 的更正。