Web-Suchdialog, der Schlüsselwörter automatisch vervollständigen und eingeben kann [Python] [Gtk]

out-1_13-100_20140921211605e7d.gif

Zuvor habe ich Zenity in einem Shell-Skript verwendet, um eine einfache Anwendung für die Suche in Firefox zu erstellen ( Praktisches reguläres Shell-Skript - Web-Suchdialog Firefox-Search.sh ), diesmal jedoch in Python konvertiert Ich werde die transplantierte vorstellen. Ich habe es geschafft, Gtk zu studieren.

Das Gesamtkonzept ist das gleiche wie bei der Erstellung mit einem Shell-Skript. Dieses Mal haben wir es jedoch so verbessert, dass die eingegebenen Zeichen mithilfe des Verlaufs automatisch vervollständigt werden.

Gtk.EntryCompletion

Es kann einfach mithilfe von Gtk.EntryCompletion von gi.repository implementiert werden.

gtk.EntryCompletion: 16.4. EntryCompletion Objects:

Ich habe es jedoch auf Github gefunden, weil es nicht für jedes durch Leerzeichen getrennte Wort übersetzt werden kann.

https://gist.github.com/evoL/1650115

Basierend auf habe ich die Regel so geändert, dass die Konvertierung für jedes durch ein Leerzeichen getrennte Wort durchgeführt wird. Danke evoL. Übrigens die 50. Zeile der oben genannten Seite

 # add the matching word
current_text = "%s %s" % (current_text, model[iter][0])

Muss gelöscht werden. In diesem Fall werden die Schlüsselwörter, die durch halbes Drücken vervollständigt werden, zweimal eingegeben.

(Wenn Sie "ubu" eingeben und "ubuntu" auswählen, wird "ubuntu ubuntu" eingegeben.)

Zusammensetzung etc.

Auch dieses Mal habe ich versucht, die Dateien zu teilen und die Einstellungen in separaten Dateien zu verwalten, um sie einer Anwendung ähnlicher zu machen. Wie die ganze Komposition

Sie können es in verschiedenen Browsern verwenden, indem Sie config.py hier neu schreiben, und Sie können die als Option angegebene Site einfach ändern oder hinzufügen. \ _ \ _ Init \ _ \ _. Py ist nur eine Datei, die benötigt wird, um es als Modul zu behandeln, und diesmal ist es leer. Es scheint besser, die Versionsprüfung hier durchzuführen.

Außerdem habe ich kürzlich gelernt, wie man Git einfach benutzt, also habe ich den Code GitHub gegeben.

http://github.com/ssh0/web_search Es ist in Ordnung zu klonen und zu gabeln.

Benutzerfreundlichkeit

Wenn Sie websearch.py ausführen,

Selection_005_20140921203310ded.png

Ein einfaches Eingabefeld wie dieses wird angezeigt. Wenn Sie Zeichen eingeben, verhält es sich wie der Anfang eines Artikels. Wenn Sie nach Abschluss der Eingabe die Eingabetaste drücken, werden die Suchergebnisse auf einer neuen Registerkarte im in config.py angegebenen Browser angezeigt.

Aufgabe

In Zukunft möchte ich eine Funktion hinzufügen, die verwandte Wörter anhand des Relevanzgrads von Wörtern vorhersagt und anzeigt, z. B. eine allgemeine Websuchleiste. Da Tippfehler schwerwiegend sind (einer der Gründe, warum ich diesen gemacht habe), hätte ich gerne eine Funktion zum Löschen der Fehler. Es gibt auch eine Möglichkeit, die Google-Suchmaschine so wie sie ist auszuleihen. Es scheint auch, dass Shell-Funktionen leicht implementiert werden können. Ist es eine Dateisuche als Verwendung? Sie können dasselbe mit dem Unity-Objektiv tun, das die Desktop-Umgebung von Ubuntu ist, aber es ist schwer und daher jetzt ausgeschaltet. Wenn es so einfach ist wie das Suchen zu lokalisieren, ist es möglicherweise leichter und bequemer, es hier zu integrieren.

Wie auch immer, der Tag ist gekommen, an dem mein Suchverlauf, der bisher nicht nützlich war, nützlich ist.

Ich hatte auch das Gefühl, dass Gtk etwas machen könnte. Ich möchte in Zukunft verschiedene Dinge berühren.

Ganzer Code

Zum Schluss legen Sie den Code offen. Die Erklärung können Sie anhand der Kommentare verstehen, was Sie tun. Dann beziehen Sie sich auf die offizielle Referenz oben. Ich würde mich über jeden Rat oder Tsukkomi freuen.

websearch.py


#!/usr/bin/env python
# -*- coding:utf-8 -*-
#
# written by ssh0, September 2014
#
# NOTE: bug: This code doesn't run correctly when the browser hasn't run.

from gi.repository import Gtk
import os
import commands
import sys

import websearch.config as config
import websearch.prediction as prediction
logfile = config.logfile


class Window(Gtk.Window):

    def __init__(self):
        self.window = Gtk.Window.__init__(self, title="search")

        # list data for completion from logfile
        lists = []
        with open(logfile) as f:
            for s in f.readlines():
                lists += unicode(s, 'utf-8').split()[1:]
        lists = set(lists)
        liststore = Gtk.ListStore(str)
        for match in lists:
            liststore.append([match])

        self.entry = prediction.EntryMultiCompletion()
        self.entry.completion.set_model(liststore)
        self.entry.completion.set_text_column(0)
        self.entry.completion.set_popup_completion(popup_completion=True)
        self.entry.connect("activate", self.enter_callback)
        self.add(self.entry)

    def enter_callback(self, event):
        # get text from entry widget
        search_term = self.entry.get_text().split()

        # if text is None, do nothing
        if len(search_term) == 0:
            return 0

        # in config.py, site must be dictionary that
        # key is option argument and value is website's address
        site = config.site

        # find option
        option= search_term[0]
        if option in site:
            goto = site[option]
            del search_term[0]
            if len(search_term) == 0:
                return 0
        # if there is no option, go to default site
        else:
            goto = site['default-search']

        # search term are joined mostly with '+'
        if len(search_term) > 1:
            t = ' '.join(search_term)
        else:
            t = search_term[0]

        # save the log to logfile
        date = commands.getoutput('date +%F_%T')
        log =  date + ' ' + t + '\n'
        with open(logfile, 'a') as l:
            l.writelines(log)

        # go to website
        base = config.browser['default']
        goto = goto % t
        os.system(base + '"' + goto + '"')
        sys.exit()


def main():
    win = Window()
    win.connect("delete-event", Gtk.main_quit)
    win.show_all()
    Gtk.main()

if __name__ == '__main__':
    main()

config.py


#!/usr/bin/env python
# -*- coding:utf-8 -*-
#
# written by ssh0, September 2014

logfile = "/home/ssh0/Dropbox/log.txt"

# choose the default browser by comment out
# or you can edit to any browser
browser = {"default":
           "firefox -new-tab "
#           "chromium-browser -new-tab "
#           "google-chrome -new-tab "
#           "opera -newtab "
            ,
           }


site = {
        # default:Google-Suche
        "default-search": r"https://www.google.co.jp/#q=%s",

        # "w": Wikipedia
        "-w": r"https:ja.wikipedia.org/wiki/%s",

        # "n":niconico video
        "-n": r"http://www.nicovideo.jp/search/%s",

        # "p":Google Bildsuche
        #"-p": r"https://www.google.com/search?q=%s&um=1&ie=UTF-8&hl=ja&tbm=isch&source=og&sa=N&tab=wi",

        # "y":Suche auf Youtube
        "-y": r"http://www.youtube.com/results?search_query=%s&sm=3",

        # "rt"Yahoo Echtzeitsuche
        "-rt": r"http://realtime.search.yahoo.co.jp/search?p=%s&ei=UTF-8",

        # "sc"Google Scholar-Suche
        "-sc": r"http://scholar.google.co.jp/scholar?q=%s&hl=ja&as_sdt=0,5",

        # "-t":Übersetzung
        "-t": r"http://ejje.weblio.jp/content/%s"
        }

prediction.py


#!/usr/bin/env python
# -*- coding:utf-8 -*-
#
# written by ssh0, September 2014
#Referenz: https://gist.github.com/evoL/1650115

from gi.repository import Gtk
import config
logfile = config.logfile


class EntryMultiCompletion(Gtk.Entry):
    def __init__(self):
        Gtk.Entry.__init__(self)
        self.completion = Gtk.EntryCompletion()

        # customize the matching function to match multiple space
        # separated words
        self.completion.set_match_func(self.match_func, None)

        # handle the match-selected signal, raised when a completion
        # is selected from popup
        self.completion.connect('match-selected', self.on_completion_match)
        self.set_completion(self.completion)

    def match_func(self, completion, key_string, iter, data):
        model = self.completion.get_model()
        modelstr = model[iter][0]

        # check if the user has typed in a space char,
        # get the last word and check if it matches something
        if ' ' in key_string:
            last_word = key_string.split()[-1]
            return modelstr.startswith(last_word)

        # we have only one word typed
        return modelstr.startswith(key_string)

    def on_completion_match(self, completion, model, iter):
        current_text = self.get_text()

        # if more than a word has been typed, we throw away the
        # last one because we want to replace it with the matching word
        # note: the user may have typed only a part of the entire word
        #       and so this step is necessary
        if ' ' in current_text:
            current_text = ' '.join(current_text.split()[:-1])
            print current_text
            current_text = '%s %s' % (current_text, model[iter][0])
            print current_text
        else:
            current_text = model[iter][0]
            print current_text

        # set back the whole text
        self.set_text(current_text)
        # move the cursor at the end
        self.set_position(-1)

        # stop the event propagation
        return True

Nachtrag

2014/09/24: Wenn in websearch.py "," usw. enthalten sind, funktioniert dies nicht ordnungsgemäß. Daher habe ich an beiden Enden der Adresse ein doppeltes Anführungszeichen hinzugefügt und es übergeben. Dadurch wird die erforderliche Zeichenkonvertierung auf der Browserseite durchgeführt.

Recommended Posts

Web-Suchdialog, der Schlüsselwörter automatisch vervollständigen und eingeben kann [Python] [Gtk]
Suchen und laden Sie YouTube-Videos automatisch mit Python herunter
Lassen Sie uns eine App erstellen, die ähnliche Bilder mit Python und Flask Part1 durchsuchen kann
Lassen Sie uns eine App erstellen, die ähnliche Bilder mit Python und Flask Part2 durchsuchen kann
So starten Sie einen einfachen WEB-Server, der CGI von PHP und Python ausführen kann
[Python] Suche nach Tiefenpriorität und Suche nach Breitenpriorität
Optimieren Sie die Websuche mit Python