gpt4 book ai didi

python - 如何以编程方式在 wxPython 中生成事件

转载 作者:行者123 更新时间:2023-11-28 16:36:40 26 4
gpt4 key购买 nike

我有一个 wxPython gui,我想以编程方式生成一个事件。

我试过这样的语法:

e = wx.Event.__init__(grid, eventType=wx.EVT_LEFT_DOWN)

结果是:

TypeError: unbound method __init__() must be called with Event instance as first argument (got Grid instance instead)

或:

 e = wx.CommandEvent(commandType=wx.EVT_BUTTON)

TypeError: in method 'new_CommandEvent', expected argument 1 of type 'wxEventType'

所以问题很简单,我需要使用什么确切的文字语法来创建事件对象?或者,有人可以给我指出一个很好的资源来理解事件吗?我不知道我是否只是遗漏了一些我理解中的简单内容。我还没能在网上找到这个问题的直接答案。我检查了这个问题:Generate a custom CommandEvent in wxPython ,但我不想创建自定义事件。

提前致谢!

最佳答案

你会想要使用wx.PostEvent

以编程方式生成事件:

wx.PostEvent(self.GetEventHandler(), wx.PyCommandEvent(wx.EVT_BUTTON.typeId, self.GetId()))

如果你想发布一个wx.EVT_BUTTON事件。将其设为 PyCommandEvent 意味着它将向上传播;其他事件类型默认不传播。

wx.PostEvent()的一般形式:http://www.wxpython.org/docs/api/wx-module.html#PostEvent

这是一个小示例代码:

import wx

class MyFrame ( wx.Frame ):

def __init__( self, parent ):
wx.Frame.__init__ ( self, parent, id = wx.ID_ANY, title = u"Test", pos = wx.DefaultPosition, size = wx.Size( 200,200 ), style = wx.DEFAULT_FRAME_STYLE|wx.TAB_TRAVERSAL )

sizer_inside = wx.BoxSizer( wx.VERTICAL )

# Adding a button and a textCtrl widget
self.button = wx.Button( self, wx.ID_ANY, u"Click Me", wx.DefaultPosition, wx.DefaultSize, 0 )
sizer_inside.Add( self.button, 0, wx.ALIGN_CENTER|wx.ALL, 5 )
self.textCtrl = wx.TextCtrl( self, wx.ID_ANY, wx.EmptyString, wx.DefaultPosition, wx.DefaultSize, wx.TE_NO_VSCROLL )
sizer_inside.Add( self.textCtrl, 0, wx.ALIGN_CENTER|wx.ALL, 5 )

self.SetSizer( sizer_inside )
self.Layout()
self.Centre( wx.BOTH )
self.Show()

self.counter = 0

# Binding Events
self.Bind( wx.EVT_BUTTON, self.on_click )
self.Bind( wx.EVT_CHOICE, self.test_dummy)

#Event handlers
def on_click( self, event ):
self.counter += 1
wx.PostEvent(self.GetEventHandler(), wx.PyCommandEvent(wx.EVT_CHOICE.typeId, self.GetId()))

def test_dummy(self, event):
self.counter += 1
self.textCtrl.SetValue(str(self.counter))

if __name__ == "__main__":
app = wx.App(False)
MyFrame(None)
app.MainLoop()

如果您运行它,请注意 textCtrl 在单击按钮后将显示 2。第一个事件处理程序手动触发由 test_dummy 处理的第二个事件。

关于python - 如何以编程方式在 wxPython 中生成事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25299745/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com