以编程方式调用wxPython EVT_BUTTON事件

时间:2012-10-08 17:21:29

标签: python wxpython

我已经看过关于这个主题的another question,但我无法获得适合我的信息,所以我想我会详细说明 - 我怀疑我只是近视。

我正在尝试从测试框架中运行我的GUI,这涉及在测试脚本中手动调用事件(在这种情况下是按下按钮)。到目前为止,除了其他不相关的guff之外,我还有:

# In GUI class:

self.button_1 = wx.Button(self, id=wx.ID_ANY, label="Button 1")
self.button_1.Bind(wx.EVT_BUTTON, self.button_1)

# In GUI Test class:

event = wx.PyCommandEvent(X, Y)
wx.PostEvent(get_gui_instance(), event)

我的问题是我不知道XY应该是什么(假设其余的都没问题)。非常感谢任何帮助。

3 个答案:

答案 0 :(得分:5)

btnInfo = wx.Button(self,-1,"Some Button")

evt = wx.PyCommandEvent(wx.EVT_BUTTON.typeId,btnInfo.GetId())
wx.PostEvent(self, evt)  #attach event to self ... alternatively maybe attach to btnInfo

应该有效

答案 1 :(得分:1)

事实证明,因为我来自GUI Test re-jigged my GUI to run in a worker thread,我可以直接与它通信。我应该早点意识到这一点,但结果是我不需要费心将GUI测试中的事件发布到GUI,因为它们在同一个进程中运行。

相反,我现在可以直接调用事件的效果。例如,我可以调用on_button_press(),绕过按钮的实际点击,这通常会触发wxPython中的事件。这允许我模拟用户交互和测试工作流程和输入范围,这正是我想要做的。

当然,这只能起作用,因为我在与测试套件相同的过程中运行GUI。发布事件似乎是前进的方式,并且在回答我自己的问题时,似乎自定义事件是调用按钮按下跨进程的方式。这意味着在GUI中使用某种“测试代理”来处理那些特定于测试的事件。

答案 2 :(得分:0)

import wx

class MessageDialog(wx.Dialog):
    def __init__(self, message, title, tiempo = 2000):

        style = wx.DEFAULT_DIALOG_STYLE | wx.RESIZE_BORDER
        super(MessageDialog, self).__init__(None, -1, title, style=style)
        text = wx.StaticText(self, -1, message)

        fuente = wx.Font(pointSize = 20, 
                     family = wx.DEFAULT, 
                     style = wx.NORMAL, 
                     weight = wx.LIGHT, 
                     underline=False, 
                     faceName="", 
                     encoding=wx.FONTENCODING_DEFAULT)        
        text.SetFont(fuente)




        self.ok = wx.Button(self, wx.ID_OK, "OK")
        sizer = wx.BoxSizer(wx.VERTICAL)
sizer.Add(text,0,wx.ALIGN_CENTER_HORIZONTAL|wx.ALIGN_CENTER_VERTICAL,5)
        sizer.Add(self.ok, 0, wx.EXPAND|wx.ALL, 5)
        self.SetSizerAndFit(sizer)
        color = "WHEAT"
        self.SetBackgroundColour(color)
        self.Center()
        self.Refresh()
        wx.FutureCall(tiempo,self.salir_ok)

    def salir_ok(self):
        par_btn = getattr(self, "ok")
        evt = wx.PyCommandEvent(wx.EVT_BUTTON.typeId, par_btn.GetId())
        wx.PostEvent(self, evt)
        return

if __name__ == '__main__':
    app = wx.App()
    dialog = MessageDialog( 'Teclee el nombre del proveedor', 'Proveedor')

    dialog.ShowModal()
    dialog.Destroy()
    app.MainLoop()