2017-02-11 6 views
1

Gibt es eine Methode, um auf ein Funktionsergebnis zuzugreifen, auf das ich eine andere Funktion angewendet habe. Zum Beispiel:Zugriffsvariable innerhalb einer Non-Return-Funktion von einem anderen Paket ohne globale Variable

win32gui.EnumWindows(a_function, extra) 

Die EnumWindows werden alle Fenster der obersten Ebene durchlaufen und Weitergabe in die a_function hwnd.

Wenn ich eine Bedingung stellen Sie die Hwnd grep Ich möchte, müssen wir die Hwnd id

Gibt es eine Methode liefern einige Rückkehr/Ertrag von a_function zuzugreifen. Anstelle der Funktion wird EnumWindows die Rückgabe grep.

Antwort

1

EnumWindows gibt nichts zurück. Die Art und Weise, wie Ergebnisse in der Regel abgerufen werden, besteht häufig darin, die Callback-Funktion dazu zu bringen, Daten in einem globalen Speicher zu speichern. Es gibt ein Beispiel dafür, das in this question zu tun. Eine andere Möglichkeit besteht darin, ein veränderbares Containerobjekt (z. B. list) als extra-Argument zu übergeben, das dann bei jedem Aufruf an das Callback als zweites Argument übergeben wird (das erste Argument ist ein Fenster-Handle).

Hier ist ein Beispiel mit der zweiten Technik, die ein lokales Listenobjekt an EnumWindows() übergibt, das die Callback-Funktion modifiziert, aber nur wenn das Fenster sichtbar ist.

import win32gui 

def my_callback(hwnd, list_object): 
    if win32gui.IsWindowVisible(hwnd): 
     title = win32gui.GetWindowText(hwnd) 
     if title: 
      list_object.append(title) 

def print_windows_titles(): 
    my_list = [] # local variable 

    win32gui.EnumWindows(my_callback, my_list) # populates my_list 

    # print result of calling EnumWindows 
    print('Titles of Visible Windows:') 
    for window_title in my_list: 
     print(' {!r}'.format(window_title)) 

print_windows_titles() 
+0

Vielen Dank für Ihre Antwort, es ist, woran ich denke. globale Variable lösen das Problem gut. Da das Vermeiden globaler Variablen eine Faustregel für einen Anfänger ist, denke ich darüber nach, ob es eine Methode zum Zugriff gibt. Manipulation im Callback und Global Hwnd ist die Lösung für diese Fragen in der Tat. –

+0

Meinst du, dass ich ein list_object in extra übergeben kann und das list_object von der Funktion what_i_need_return = win32gui.EnumWindows (a_function, list_object) .list_object? –

+0

Nein. Ich meine, dass Sie ein Listenobjekt an 'EnumWindows' übergeben können und es jedes Mal an Ihre Callback-Funktion übergeben wird, *** *** *** es aufgerufen wird. Aber Sie haben Recht damit, eine globale Variable zu vermeiden. – martineau

Verwandte Themen