QtWebkit Formulare Autovervollständigung

Python und das Qt-Toolkit, erstellen von GUIs mittels des Qt-Designers.
Antworten
Andyh
User
Beiträge: 319
Registriert: Dienstag 8. Januar 2008, 19:52
Kontaktdaten:

Hallo

Der Titel sag ja schon das meiste, ich möchte wie das so üblich ist bei den heutigen Browsern eine Autovervollständigung für Formulare.
Leider habe ich keine Ahnung wie ich das angehe.
Vielleicht kann ich ja mit dem jswebkit die Formularfelder finden, aber wie mache ich dann die vervollständigungs Liste die an dem Formularfeld auftauchen soll.
Das setzten des Textes müsste dann auch wieder durch den jswebkit machbar sein.

Oder wie macht man das, hat der QtWebkit da schon was eingebaut?

Gruß
Andyh
Meinen Dickschädel schon bemerkt?
Ich bin jetzt FACHARBEITER (Zerspanungsmechaniker)!!!
[code]import sys

if sys.platform == "win32":
print "this program only runs on operating systems!!!"
sys.TotalError()[/code]
Benutzeravatar
snafu
User
Beiträge: 6738
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Eingebaut: Nicht, dass ich wüsste. Ich hätte jetzt gesagt, dass du dir vielleicht den Quelltext von Arora angucken könntest (Browser, der mit Qt entwickelt wurde), aber ich glaube, die haben das auch noch nicht drin.
Andyh
User
Beiträge: 319
Registriert: Dienstag 8. Januar 2008, 19:52
Kontaktdaten:

Hallo

Danke für deine Antwort.

Ich halte es für eine sehr praktische Sache, deswegen will ich es unbedingt haben!

Ich habe glaub ich einen Weg gefunden:
Ich binde mit evaluateJavaScript() jQuery und jquery.autocomplete ein.
jetzt versuche ich noch über den Quelltext die Formulare zu finden (Beautifulsoup werde ich dazu nehmen) und dann noch für jedes gefundenes Formularfeld den passenden Javascript.

Das ist dann mal zum Eintragen, wie ich die Werte beim abschicken abspeichern kann ist noch gelöst.

Gruß
Andyh
Meinen Dickschädel schon bemerkt?
Ich bin jetzt FACHARBEITER (Zerspanungsmechaniker)!!!
[code]import sys

if sys.platform == "win32":
print "this program only runs on operating systems!!!"
sys.TotalError()[/code]
Benutzeravatar
snafu
User
Beiträge: 6738
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Zum Finden der Formulare böte sich auch `mechanize` an. Du müsstest da dann nur noch duch die Formulare iterieren und bräuchtest dich nicht mehr um das Parsen auf HTML-Basis zu kümmern:

Code: Alles auswählen

In [1]: import mechanize

In [2]: br = mechanize.Browser()

In [3]: br.open('http://www.youtube.de/')
Out[3]: <response_seek_wrapper at 0xb7606cacL whose wrapped object = <closeable_response at 0xb760402cL 
whose fp = <socket._fileobject object at 0xb75fba04>>>

In [4]: [form for form in br.forms()]
Out[4]: 
[<ClientForm.HTMLForm instance at 0x9acee4c>,
 <ClientForm.HTMLForm instance at 0x9acefec>,
 <ClientForm.HTMLForm instance at 0x9ace64c>]
Alternativ ließe sich auch nutzen:

Code: Alles auswählen

evaluateJavaScript("document.forms")
Andyh
User
Beiträge: 319
Registriert: Dienstag 8. Januar 2008, 19:52
Kontaktdaten:

Hallo

Deine zwei Vorschläge sind nicht schlecht.

Ich habe es jetzt so:

Code: Alles auswählen

    def can_form_fill(self, form):
        '''
        testet ob man ein formular automatisch ausfüllen darf
        '''
        if form.has_key("autocomplete"):
            if form["autocomplete"] == "off":
                return False
            else:
                return True
        else:
            return True
    
    def form_auto_comp(self):
        '''
        erstellt die autovervollständigung
        '''
        html = self.get_html()
        soup = BeautifulSoup(html)
        felder = []
        
        for form in soup.findAll("form"):
            if self.can_form_fill(form):
                for x in soup.findAll("input"):
                    if x.has_key("type"):
                        if type != "password":
                            if x.has_key("name"):
                                felder.append(x["name"])
                        
                            elif x.has_key("id"):
                                felder.append(x["id"]) 

Gruß
Andyh
Meinen Dickschädel schon bemerkt?
Ich bin jetzt FACHARBEITER (Zerspanungsmechaniker)!!!
[code]import sys

if sys.platform == "win32":
print "this program only runs on operating systems!!!"
sys.TotalError()[/code]
Andyh
User
Beiträge: 319
Registriert: Dienstag 8. Januar 2008, 19:52
Kontaktdaten:

Hallo

zum auslesen der Daten gibt es diesen Beispiel:
http://doc.trolltech.com/4.5/webkit-formextractor.html

Komme da nur nicht mit :oops:

Kann mir da jemand weiter helfen?

Gruß
Andyh
Meinen Dickschädel schon bemerkt?
Ich bin jetzt FACHARBEITER (Zerspanungsmechaniker)!!!
[code]import sys

if sys.platform == "win32":
print "this program only runs on operating systems!!!"
sys.TotalError()[/code]
jerch
User
Beiträge: 1669
Registriert: Mittwoch 4. März 2009, 14:19

Naja, der Quellcode verrät nur die Hälfte, bzw. kann ich den Sourcecode des HTML-Dokumentes nicht finden.

Folgendes passiert wahrscheinlich auf der Seite:
- Du befüllst das Formular mit Daten
- das Formularsubmit triggert dann die JS-Funktion formExtractor.setValue(wert1, wert1...), welche direkt mit den LineEdits rechts verknüpft ist

Wo kommt formExtractor im JS-Kontext her? In der Methode populateJavaScriptWindowObject() wird das gesamte FormExtractor-Objekt mittels addToJavaScriptWindowObject("formExtractor", this) in den Kontext gehievt und unter formExtractor bekannt gemacht. Slots werden dann automatisch zu JS-Methoden, und Du kannst halt setValue() mit dem entsprechenden Ergebnis, daß die LineEdits befüllt werden, in JS aufrufen.
Antworten