WxPython-在代码中设置其值时触发复选框事件



考虑以下代码:

import wx
class MyFrame(wx.Frame):
    def __init__(self, *args, **kwds):
        wx.Frame.__init__(self, *args, **kwds)
        self.cb1 = wx.CheckBox(self, -1, "CheckBox 1")
        self.cb2 = wx.CheckBox(self, -1, "CheckBox 2")
        self.cb3 = wx.CheckBox(self, -1, "CheckBox 3")
        sizer = wx.BoxSizer(wx.VERTICAL)
        sizer.Add(self.cb1, 0, wx.ADJUST_MINSIZE, 0)
        sizer.Add(self.cb2, 0, wx.ADJUST_MINSIZE, 0)
        sizer.Add(self.cb3, 0, wx.ADJUST_MINSIZE, 0)
        self.SetSizer(sizer)
        self.Layout()
        self.Bind(wx.EVT_CHECKBOX, self.OnCb1, self.cb1)
        self.Bind(wx.EVT_CHECKBOX, self.OnCb2, self.cb2)
    def OnCb1(self, evt):
        self.cb2.SetValue(evt.IsChecked())
    def OnCb2(self, evt):
        self.cb3.SetValue(evt.IsChecked())

if __name__ == "__main__":
    app = wx.PySimpleApp(0)
    frame = MyFrame(None, -1, "")
    app.SetTopWindow(frame)
    frame.Show()
    app.MainLoop()

这里我有3个复选框绑定在一起,所以cb2cb1时被选中,cb3cb2时被选中。但是,当我在OnCb1例程中设置cb2的值时,不会触发cb2复选框事件,并且cb3复选框保持未选中状态。所以我想找到一种方法,手动触发cb2事件,在只检查cb1时同时检查所有3个框。如果有人给我一个提示,我将不胜感激。

使用wx。发布事件。。。像这样:

class launcherWindow(wx.Frame):
    def __init__(self):
        wx.Frame.__init__(self, parent=None, title='New Window')
        #now add the main body, start with a panel
        panel = wx.Panel(self)
        #instantiate a new dropdown
        self.productDropDown = wx.ComboBox(panel, size=wx.DefaultSize, style = wx.CB_READONLY)
        #get the products and product subtypes
        self.productDict = self.getProductsAndSubtypes()
        #setup subtypes first, just in case, since onProductSelection will reference this
        self.productSubtypeDropDown = wx.ComboBox(panel, size=wx.DefaultSize, style = wx.CB_READONLY)
        #add products
        for product in self.productDict.keys():
            self.productDropDown.Append(product)
        #bind selection event
        self.productDropDown.Bind(wx.EVT_COMBOBOX, self.onProductSelection)
        #set default selection
        self.productDropDown.SetSelection(0)
        #pretend that we clicked the product selection, so it's event gets called
        wx.PostEvent(self.productDropDown, wx.CommandEvent(wx.wxEVT_COMMAND_COMBOBOX_SELECTED))
        #now add the dropdown to a sizer, set the sizer for the panel, fit the panel, etc...
    def onProductSelection(self, event):
        productSelected = self.productDropDown.GetStringSelection()
        productSubtypes = self.productDict[productSelected]
        #clear any existing product subtypes, since each product may have different ones
        self.productSubtypeDropDown.Clear()
        for productSubtype in productSubtypes:
            self.productSubtypeDropDown.Append(productSubtype)
        #select the first item by default
        self.productSubtypeDropDown.SetSelection(0)

我无法直接采用nmz787的代码,不得不进行一些破解,但我最终让它为工作

  • 更改复选框的状态,以及
  • 使复选框接收事件

就像用户点击它一样。

我想我应该发布我的代码,以防其他人也在努力让它发挥作用。由于它只取决于复选框,而不取决于调用它的控件,所以我将它分解为一个独立的"顶级"函数,而不是任何类上的方法。

def toggleCheckBox(cb):
    evt = wx.CommandEvent(commandType=wx.EVT_CHECKBOX.typeId)
    evt.SetEventObject(cb)
    cb.SetValue( not cb.GetValue())
    wx.PostEvent(cb, evt)

我不知道为什么CommandEvent构造函数需要一个关键字,也不知道是否有一种更明智、更稳健的方法来获得所需的typeId,但这对我来说很有效

我对wxPython没有经验,所以我不能给你一个具体的例子,但我知道以编程方式设置值不会触发小部件的命令事件。我的假设是,在设置cb2的值后,您将不得不手动发布该事件。您可以在此处查看类似的问题:wxPython:手动调用事件

我可能建议将wx子类化。复选框,并创建一个SetValueWithEvent()或类似方法,该方法将调用SetValue并发布wx. EVT_CHECKBOX事件。

PyQt也有类似的情况,当在小部件上以编程方式设置值时,可能会发出信号,也可能不会发出信号。他们有时会给你不止一个信号,你可以倾听,以适应任何一种方式。不幸的是,仅根据我对wxPython示例的有限了解,我认为它要原始得多,也不那么像蟒蛇。所以你似乎不得不多做一点自己的事情。

相关内容

  • 没有找到相关文章

最新更新