wxPython、单选按钮选择/取消选择和wx.RB_组

wxPython、单选按钮选择/取消选择和wx.RB_组,wxpython,radio-button,Wxpython,Radio Button,wxPython和(分组)单选按钮问题: 我有三个单选按钮被绑定在一个组中,我看到这给了我一个单选按钮a、B或C的选择,其中一个总是被选中的——我理解这是wx.RB_组样式的本质 是否可以通过仅单击单选按钮来取消选择A=B=C=False中的所有按钮?我简化了代码(如下),其中重置按钮执行此功能,但理想情况下,我只想在GUI中取消选择 import wx class MyForm(wx.Frame): def __init__(self): wx.Frame.__init

wxPython和(分组)单选按钮问题:

我有三个单选按钮被绑定在一个组中,我看到这给了我一个单选按钮a、B或C的选择,其中一个总是被选中的——我理解这是wx.RB_组样式的本质

是否可以通过仅单击单选按钮来取消选择A=B=C=False中的所有按钮?我简化了代码(如下),其中重置按钮执行此功能,但理想情况下,我只想在GUI中取消选择

import wx
class MyForm(wx.Frame):
    def __init__(self):
        wx.Frame.__init__(self, None, -1, "Tutorial", size=(300,250))
        panel = wx.Panel(self, wx.ID_ANY)
        self.radio1 = wx.RadioButton(panel, label="A", pos=(20,40), style=wx.RB_GROUP)
        self.radio2 = wx.RadioButton(panel, label="B", pos=(20,70))
        self.radio3 = wx.RadioButton(panel, label="C", pos=(20,100))

        btn = wx.Button(panel, label="Check", pos=(20,140))
        rst = wx.Button(panel, label="Reset", pos=(20,170))
        btn.Bind(wx.EVT_BUTTON, self.onBtn)
        rst.Bind(wx.EVT_BUTTON, self.onRst)

    def onBtn(self, event):
        print "A = ", self.radio1.GetValue()
        print "B = ", self.radio2.GetValue()
        print "C = ", self.radio3.GetValue()
        print "\n\n"

    def onRst(self, event):
        self.radio1.SetValue( 0 )
        self.radio2.SetValue( 0 )
        self.radio3.SetValue( 0 )

if __name__ == "__main__":
    app = wx.PySimpleApp()
    frame = MyForm().Show()
    app.MainLoop()

就我所知,wxPython本机不支持这一点。此外,这不是任何UI中单选按钮的预期行为,因此我的第一个想法是您的界面设计不正确。您是否考虑过添加另一个“无”单选按钮,该按钮在逻辑上等同于未选择任何单选按钮?为什么不呢

然而,我确实试图给你一个解决方案,但没有成功。事实上,考虑到我面临的困难,我高度怀疑,即使有可能对这种行为进行编程,你还是最好找到一个替代方案

我的第一个想法是通过创建一个自定义的
wx.RadioButton
来覆盖
wx.RadioButton
处理被选择的方式。以下是我在该方法中发现的一些问题:

  • wx.EVT_单选按钮
    仅在系统已更改单选按钮的值后被捕获,因此我无法实际覆盖该行为
  • 按钮在不同的时间捕获
    wx.EVT_RADIOBUTTON
    (当未指定
    id
    时),因此无法预测系统是否有进一步的更改排队,这可能会覆盖您对按钮值所做的任何更改
  • wx.EVT_单选按钮
    如果已选择单选按钮,则不会生成该单选按钮
  • wxPython只有
    wx.EVT_LEFT_DOWN
    wx.EVT_LEFT_UP
    事件,这两个事件都没有完全描述单选按钮如何知道它已被单击
  • 然后,我转到了一个自定义的
    wx.RadioBox
    ,但我很快意识到,没有任何方法可以完全取消选择收音机框内的按钮,这意味着它也不是一个可接受的选择

    我想您可以编写某种自定义的
    wx.Panel
    ,其中包含多个
    wx.CheckBox
    对象,并尝试强制一次最多只选择一个复选框,但您再次遇到一个问题,即这不是用户希望复选框工作的方式。我以前见过这种行为,但每次我都觉得奇怪,我不能推荐它。它还需要相当大的努力来发展

    我能找到的最接近您要求的解决方案是一个自定义的
    wx.RadioButton
    ,双击时取消选择。这里的问题是,用户不希望双击取消选择单选按钮,因此您现在需要考虑如何教他们这一点

    class DeselectableRB(wx.RadioButton):
        def __init__(self, parent, label, pos=None, style=0):
            #do the default init
            wx.RadioButton.__init__(self, parent, label=label, pos=pos, style=style)
    
            #catch double clicks
            self.Bind(wx.EVT_LEFT_DCLICK, self.onDClick)
    
        def onDClick(self, event):
            self.SetValue(0)
    

    然而,我仍然强烈认为,添加一个标签为“无”的
    wx.RadioButton
    是您最好的解决方案,因为它只需要很少的努力,并且符合用户对单选按钮应该如何工作的期望(使其更直观)。

    据我所知,这在wxPython中不受本机支持。此外,这不是任何UI中单选按钮的预期行为,因此我的第一个想法是您的界面设计不正确。您是否考虑过添加另一个“无”单选按钮,该按钮在逻辑上等同于未选择任何单选按钮?为什么不呢

    然而,我确实试图给你一个解决方案,但没有成功。事实上,考虑到我面临的困难,我高度怀疑,即使有可能对这种行为进行编程,你还是最好找到一个替代方案

    我的第一个想法是通过创建一个自定义的
    wx.RadioButton
    来覆盖
    wx.RadioButton
    处理被选择的方式。以下是我在该方法中发现的一些问题:

  • wx.EVT_单选按钮
    仅在系统已更改单选按钮的值后被捕获,因此我无法实际覆盖该行为
  • 按钮在不同的时间捕获
    wx.EVT_RADIOBUTTON
    (当未指定
    id
    时),因此无法预测系统是否有进一步的更改排队,这可能会覆盖您对按钮值所做的任何更改
  • wx.EVT_单选按钮
    如果已选择单选按钮,则不会生成该单选按钮
  • wxPython只有
    wx.EVT_LEFT_DOWN
    wx.EVT_LEFT_UP
    事件,这两个事件都没有完全描述单选按钮如何知道它已被单击
  • 然后,我转到了一个自定义的
    wx.RadioBox
    ,但我很快意识到,没有任何方法可以完全取消选择收音机框内的按钮,这意味着它也不是一个可接受的选择

    我想您可以编写某种自定义的
    wx.Panel
    ,其中包含多个
    wx.CheckBox
    对象,并尝试强制一次最多只选择一个复选框,但您再次遇到一个问题,即这不是用户希望复选框工作的方式。我以前见过这种行为,但每次我都觉得奇怪,我不能推荐它。它还需要相当大的努力来发展

    我能找到的最接近您要求的解决方案是一个自定义的
    wx.RadioButton
    ,双击时取消选择。这里的问题是,用户不希望双击取消选择单选按钮,因此您现在需要考虑如何教他们这一点

    class DeselectableRB(wx.RadioButton):
        def __init__(self, parent, label, pos=None, style=0):
            #do the default init
            wx.RadioButton.__init__(self, parent, label=label, pos=pos, style=style)
    
            #catch double clicks
            self.Bind(wx.EVT_LEFT_DCLICK, self.onDClick)
    
        def onDClick(self, event):
            self.SetValue(0)
    

    但是,我仍然强烈认为,添加一个标签为“无”的
    wx.RadioButton
    是您的最佳解决方案,因为它只需要很少的努力,并且符合用户对单选按钮工作方式的期望(使其更直观)。

    这可以像取消复选框一样取消选择RadioButton:

    import wx
    class MyForm(wx.Frame):
        def __init__(self):
            wx.Frame.__init__(self, None, -1, "Tutorial", size=(300,250))
            panel = wx.Panel(self, wx.ID_ANY)
            self.radio1 = wx.RadioButton(panel, label="A", name='radio1', pos=(20,40), style=wx.RB_GROUP)
            self.radio2 = wx.RadioButton(panel, label="B", name='radio2', pos=(20,70))
            self.radio3 = wx.RadioButton(panel, label="C", name='radio3', pos=(20,100))
    
            self.radio1.Bind(wx.EVT_LEFT_DOWN, self.OnRB)
            self.radio2.Bind(wx.EVT_LEFT_DOWN, self.OnRB)
            self.radio3.Bind(wx.EVT_LEFT_DOWN, self.OnRB)
    
    
            btn = wx.Button(panel, label="Check", pos=(20,140))
            rst = wx.Button(panel, label="Reset", pos=(20,170))
            btn.Bind(wx.EVT_BUTTON, self.onBtn)
            rst.Bind(wx.EVT_BUTTON, self.onRst)
    
        def OnRB(self, event):
            event.GetEventObject().SetValue(not event.GetEventObject().GetValue())
    
        def onBtn(self, event):
            print "A = ", self.radio1.GetValue()
            print "B = ", self.radio2.GetValue()
            print "C = ", self.radio3.GetValue()
            print "\n\n"
    
        def onRst(self, event):
            self.radio1.SetValue( 0 )
            self.radio2.SetValue( 0 )
            self.radio3.SetValue( 0 )
    
    if __name__ == "__main__":
        app = wx.PySimpleApp()
        frame = MyForm().Show()
        app.MainLoop()
    
    注意