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