【问题标题】:wxPython controls not clickablewxPython 控件不可点击
【发布时间】:2009-12-16 10:25:38
【问题描述】:
//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 之类的东西吗?

【问题讨论】:

    标签: controls wxpython wxwidgets clickable


    【解决方案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)
    ...
    

    【讨论】:

      【解决方案2】:

      我遇到了同样的问题,我刚刚找到了解决方案。在 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()
      

      【讨论】:

        猜你喜欢
        • 2017-05-28
        • 1970-01-01
        • 1970-01-01
        • 2014-06-28
        • 1970-01-01
        • 1970-01-01
        • 2017-11-05
        • 2018-03-05
        • 1970-01-01
        相关资源
        最近更新 更多