根据 wxWidgets 文档1,
wxRB_SINGLE
要求程序员从按钮的事件处理程序中手动处理选择和取消选择单选按钮。然而,尽我所能,wxPython 不允许我这样做。我尝试直接在单选按钮上调用 SetValue(False)
并从 wx.EVT_RADIOBUTTON
处理程序调用相同的函数,但无论如何单选按钮保持选中状态并且 GetValue()
返回 True。是什么赋予了?我是否从根本上误解了wx.RB_SINGLE
?
澄清一下,我的目标是让单选按钮(从程序员的角度来看)功能类似于复选框。我想亲自处理他们的具体行为。我不希望 wxWidgets 完成任何自动分组。
这是我用来调试这个的代码:
import wx
class Example(wx.Frame):
def __init__(self, *args, **kwargs):
super(Example, self).__init__(*args, **kwargs)
panel = wx.Panel(self)
rb1 = wx.RadioButton(panel,
label = 'Button 1',
pos = (30, 10),
style=wx.RB_SINGLE
)
rb2 = wx.RadioButton(panel,
label = 'Button 2',
pos = (30, 30),
style=wx.RB_SINGLE
)
rb3 = wx.RadioButton(panel,
label = 'Button 3',
pos = (30, 50),
style=wx.RB_SINGLE
)
rb2.Bind(wx.EVT_RADIOBUTTON, lambda x: rb2.SetValue(False))
rb2.SetValue(False)
def main():
app = wx.App()
ex = Example(None)
ex.Show(True)
app.MainLoop()
if __name__ == '__main__':
main()
就其价值而言,我使用 Ubuntu Linux 22.04 LTS 和 GTK(版本 3.24.33-1ubuntu2)后端,用于在 Python 3.10.6 上运行的 wxWidgets(通过 wxPython 4.2.0)。
看起来你运气不好,这种风格似乎是一个考虑不周的选择,因为它显然不起作用,正如你所期望的那样。
您的选择仅限于
wx.CheckBox
,或者您可以在此处查看替代方案 onoffbutton.py
:
https://discuss.wxpython.org/t/an-on-off-button-alternative-to-checkbox/36304/19
剧透警告,我是作者。 它有各种无线电类型开/关按钮 - 从线程上的最后一篇文章获取 zip 文件。
这是由于 wxGTK 中的错误造成的。我提交了一个 pull request 来修复这个问题,根据维护者的评论,它似乎将被合并到 wxWidgets 3.3.0。如果您使用的是旧版本,不幸的是我不知道有任何解决方法。