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
WxPython 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()
如果删除这三行,它会表现正常,但控件垂直太大。
感谢。
答案 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。