2009-12-16 25 views
1
//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?wxPython控件不可点击

回答

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