Ich habe eine andere Frage zu diesem Thema gesehen, aber ich konnte die nicht ganz verstehen Informationen, die für mich arbeiten sollen, also dachte ich, ich würde meine Einzelheiten mitteilen - ich vermute, ich bin nur kurzsichtig.

Ich versuche, meine GUI über ein Testframework zu trainieren, bei dem ein Ereignis (in diesem Fall ein Tastendruck) in einem Testskript manuell aufgerufen wird. Bisher habe ich zusätzlich zu anderen irrelevanten Guffs:

# 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)

Mein Problem ist, dass ich nicht weiß, was X und Y sein sollen (vorausgesetzt, der Rest ist in Ordnung). Jede Hilfe wird sehr geschätzt.

3
Ed King 8 Okt. 2012 im 21:21

3 Antworten

Beste Antwort

Es stellt sich also heraus, dass ich meine GUI neu ausgerichtet habe, um sie in einem Arbeitsthread auszuführen von GUI Test Ich kann direkt damit kommunizieren. Ich hätte das früher erkennen sollen, aber das Ergebnis ist, dass ich mich nicht darum kümmern muss, Ereignisse vom GUI-Test auf der GUI zu veröffentlichen, da sie im selben Prozess ausgeführt werden.

Stattdessen kann ich jetzt die Effekte von Ereignissen direkt aufrufen. Zum Beispiel kann ich on_button_press() aufrufen und dabei das tatsächliche Klicken auf die Schaltfläche umgehen, wodurch das Ereignis in wxPython normalerweise ausgelöst wird. Auf diese Weise kann ich Benutzerinteraktionen simulieren und Workflows und Eingabebereiche testen, genau das wollte ich tun.

Dies funktioniert natürlich nur, weil ich meine GUI im selben Prozess wie die Testsuite ausführe. Das Posten von Ereignissen scheint ansonsten der richtige Weg zu sein, und als Antwort auf meine eigene Frage scheinen benutzerdefinierte Ereignisse der Weg zu sein, um prozessübergreifende Tastendrücke aufzurufen. Dies impliziert die Verwendung einer Art "Testagent" innerhalb der GUI, um die für den Test spezifischen Ereignisse zu behandeln.

1
Ed King 9 Okt. 2012 im 10:31
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

Sollte arbeiten

5
Joran Beasley 8 Okt. 2012 im 17:51
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()
0
Jose Federico Mares 23 Nov. 2016 im 23:32