wxPython、单选按钮选择/取消选择和wx.RB_组
wxPython和(分组)单选按钮问题: 我有三个单选按钮被绑定在一个组中,我看到这给了我一个单选按钮a、B或C的选择,其中一个总是被选中的——我理解这是wx.RB_组样式的本质 是否可以通过仅单击单选按钮来取消选择A=B=C=False中的所有按钮?我简化了代码(如下),其中重置按钮执行此功能,但理想情况下,我只想在GUI中取消选择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
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_单选按钮
如果已选择单选按钮,则不会生成该单选按钮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_单选按钮
如果已选择单选按钮,则不会生成该单选按钮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()
注意