//if I use BoxSizer instead of StaticBoxSizer, the button is clickable.
//if there is a radio button under StaticBoxSizer, it is clickable,
//but the button is not
row1 = wx.StaticBoxSizer(wx.StaticBox(panel, -1, 'this is row one'), orient=wx.HORIZONTAL)
row1.Add(label1,0,wx.TOP | wx.RIGHT,7)
row1.Add(self.fileCtrl)
row2 = wx.BoxSizer(wx.HORIZONTAL)
//for everything in row2, neither buttons nor radio buttons are clickable
actionBox = wx.StaticBoxSizer(wx.StaticBox(panel, -1, 'asdfasdf'), orient=wx.VERTICAL)
actionRow1 = wx.BoxSizer(wx.HORIZONTAL)
actionRow1.Add(wx.StaticText(panel, -1, 'blah blah ', (5, 5)))
actionRow1.Add(self.mailRadio)
actionRow2 = wx.BoxSizer(wx.HORIZONTAL)
actionRow2.Add(wx.StaticText(panel, -1, 'lah dee dah', (5, 5)))
actionRow2.Add(self.uploadRadio,5)
actionBox.Add(actionRow1,0,wx.EXPAND)
actionBox.Add(actionRow2)
row2.Add(actionBox)
wrapper = wx.FlexGridSizer(2,1,5,5)
wrapper.AddGrowableCol(0)
wrapper.Add(row1,0,wx.TOP | wx.LEFT | wx.RIGHT | wx.ALIGN_CENTER,15)
wrapper.Add(row2,0,wx.ALL | wx.ALIGN_CENTER,15)
panel.SetSizerAndFit(wrapper)
self.Centre()
self.Fit()
我在OS X中测试它,但我也需要它在Windows上工作。对此很新,所以这让我感到困惑。我必须设置像css z-index这样的东西吗?
答案 0 :(得分:1)
这应该有效:
import wx
class MainWindow(wx.Frame):
def __init__(self, *args, **kwargs):
wx.Frame.__init__(self, *args, **kwargs)
self.panel = wx.Panel(self)
self.label1 = wx.StaticText(self.panel)
self.fileCtrl = wx.FilePickerCtrl(self.panel)
self.mailRadio = wx.RadioButton(self.panel)
self.uploadRadio = wx.RadioButton(self.panel)
row1 = wx.StaticBoxSizer(wx.StaticBox(self.panel, -1, 'this is row one'), orient=wx.HORIZONTAL)
row1.Add(self.label1,0,wx.TOP | wx.RIGHT,7)
row1.Add(self.fileCtrl)
row2 = wx.BoxSizer(wx.HORIZONTAL)
actionBox = wx.StaticBoxSizer(wx.StaticBox(self.panel, -1, 'asdfasdf'), orient=wx.VERTICAL)
actionRow1 = wx.BoxSizer(wx.HORIZONTAL)
actionRow1.Add(wx.StaticText(self.panel, -1, 'blah blah ', (5, 5)))
actionRow1.Add(self.mailRadio)
actionRow2 = wx.BoxSizer(wx.HORIZONTAL)
actionRow2.Add(wx.StaticText(self.panel, -1, 'lah dee dah', (5, 5)))
actionRow2.Add(self.uploadRadio,5)
actionBox.Add(actionRow1,0,wx.EXPAND)
actionBox.Add(actionRow2)
row2.Add(actionBox)
wrapper = wx.FlexGridSizer(2,1,5,5)
wrapper.AddGrowableCol(0)
wrapper.Add(row1,0,wx.TOP | wx.LEFT | wx.RIGHT | wx.ALIGN_CENTER,15)
wrapper.Add(row2,0,wx.ALL | wx.ALIGN_CENTER,15)
self.panel.SetSizerAndFit(wrapper)
self.Centre()
self.Fit()
self.Show()
app = wx.App(False)
win = MainWindow(None)
app.MainLoop()
您的小部件似乎以错误的方式成为父级。更改为此时,我得到了“不可点击”的行为:
...
self.label1 = wx.StaticText(self)
self.fileCtrl = wx.FilePickerCtrl(self)
self.mailRadio = wx.RadioButton(self)
self.uploadRadio = wx.RadioButton(self)
...
答案 1 :(得分:0)
我遇到了同样的问题,我刚刚找到了解决方案。在MacOS X中,创建小部件的顺序非常重要。
必须在所有包含的小部件之前创建StaticBoxSizer。否则这些元素可能无法点击。
不可点击的按钮示例:
import wx
class MainWindow(wx.Frame):
def __init__(self):
wx.Frame.__init__(self, None, -1, 'not-clickable')
self.panel = wx.Panel(self)
button = wx.Button(self.panel, -1, "Can't click me")
sttBox = wx.StaticBox(self.panel, -1, "Created after button")
sizer = wx.StaticBoxSizer(sttBox, wx.HORIZONTAL)
sizer.Add(button)
self.panel.SetSizerAndFit(sizer)
self.Centre()
self.Fit()
if __name__ == '__main__':
app = wx.PySimpleApp()
frame = MainWindow()
frame.Show()
app.MainLoop()
可点击按钮示例:
import wx
class MainWindow(wx.Frame):
def __init__(self):
wx.Frame.__init__(self, None, -1, 'clickable')
self.panel = wx.Panel(self)
sttBox = wx.StaticBox(self.panel, -1, "Created before button")
button = wx.Button(self.panel, -1, "I'm clickable")
sizer = wx.StaticBoxSizer(sttBox, wx.HORIZONTAL)
sizer.Add(button)
self.panel.SetSizerAndFit(sizer)
self.Centre()
self.Fit()
if __name__ == '__main__':
app = wx.PySimpleApp()
frame = MainWindow()
frame.Show()
app.MainLoop()