2017-07-24 2 views
1

Gibt es eine Möglichkeit, Verzögerungen bei double_click_input() Aktionen loszuwerden?Wie werden Verzögerungen bei double_click_input() Aktionen beseitigt?

Was ich versuche zu tun ist, doppelklicken Sie auf das Bearbeitungsfeld und geben Sie dann hier die Tasten ein. Möglicherweise haben beide Aktionen eine gewisse Verzögerung, so dass der gesamte Prozess sehr langsam abläuft.

Code:

myApp = Desktop(backend='uia').window(title_re='myTitle_re')  
myApp.window(auto_id='myAutoId').window(title='myTitle').double_click_input() 
myApp.descendants(title='myTitle', control_type='Edit')[1].type_keys('myKeys') 

Und eine weitere Frage: Ich habe versucht, hier zu verwenden double_click(), aber es wirft immer eine Ausnahme:

AttributeError: WindowSpecification class has no 'double_click' method.

Dann habe ich versucht myApp.window(auto_id='myAutoId').window(title='myTitle').wrapper_object().double_click()

Und erhalten:

AttributeError: 'ListItemWrapper' object has no attribute 'double_click'

Was muss ich ändern, um diese Arbeit zu bekommen?

Ich benutze pywinauto 0.6.3.

+0

Timings können mit der Klasse 'pywinauto.timings.Timings' ausgerichtet werden, sodass Sie die Verzögerung auf null setzen können. Ich kann auf den genauen Variablennamen am Abend zeigen. 'double_click' ist nicht implementiert, weil es unklar ist, welche stille Aktion (UIAutomation Pattern) als Doppelklick-Aktion interpretiert werden soll. Wir haben Methoden aufrufen und ButtonWrapper.click = Alias ​​aufrufen. Aber für Nicht-Buttons kann InvokePattern eine andere Bedeutung haben. Deshalb haben wir es als '.invoke()' gelassen. Für 'backend =" win32 "' haben wir 'double_click' mit' WM_DBLCLICK' Fenstermeldung. Aber 'double_click_input' ist für beide Backends gleich. –

+0

Entschuldigung für Verzögerungen mit Details. Es ist ein Hobbyprojekt, das wir außerhalb der Bürozeiten machen. –

+0

Es ist in Ordnung, ich werde warten. :) Und danke für 'invoke()', es ist sogar besser als 'double_click_input()' für meinen Fall. –

Antwort

1

Bei der Beantwortung Ihrer ersten Frage können Sie mithilfe der globalen Einstellungen einige Zeitpunkte auf null setzen. Für double_click_input:

from pywinauto.timings import Timings 
Timings.after_clickinput_wait = 0.0 
Timings.after_setcursorpos_wait = 0.0 

Für echte Benutzereingabe (*_input Methoden) ändernden Timings modifizierte Sequenz verursachen kann, nicht zu arbeiten. Aber Sie können auf eigenes Risiko experimentieren. Manchmal ist es besser, stille Methoden zu verwenden, die Fenstermeldungen wie WM_CLICK (für "win32" Backend) oder UIAutomation Patterns wie Invoke Pattern (für "uia" Backend) verwenden.

double_click ist nicht für "uia" implementiert, da unklar ist, welches UIAutomation-Muster als Doppelklick-Aktion interpretiert werden soll. Wir haben die Methode .invoke() und ButtonWrapper.click = invoke Alias. Aber für Nicht-Buttons kann InvokePattern eine andere Bedeutung haben. Deshalb haben wir es als .invoke() verlassen.

P.S. In Bezug auf Legacy-Property-Text ... Es kann durch .legacy_properties()[u'Value'] für Ihren Fall (oder andere Wert von zurückgegebenen dict) erhalten werden. Es gibt Methoden set_window_text/set_edit_text mit ValuePattern, so dass der Text still und ohne Tricks gesetzt werden kann.

+0

Danke für Ihre Hilfe! Über diese Methoden: Ich habe sie versucht, aber habe die Ausnahme 'AttributeError: WindowSpecification Klasse hat keine 'set_windiow_text/set_edit_text' Methode. Ich finde, dass ich zu oft Ausnahmen in Bezug auf die Klasse WindowSpecification bekomme, also vermisse ich vielleicht etwas im Konzept davon. –

+0

Es ist eine unklare Nachricht, wenn das Element nicht gefunden wurde. Wir haben vor, es zu reparieren. Siehe [Problem # 364] (https://github.com/pywinauto/pywinauto/issues/364). –

Verwandte Themen