2009-12-16 67 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()