Boîte de dialogue de recherche Web qui peut automatiquement compléter et saisir des mots-clés [Python] [Gtk]

out-1_13-100_20140921211605e7d.gif

Auparavant, j'ai utilisé Zenity dans un script shell pour créer une application simple de recherche dans Firefox ( Script shell standard pratique - boîte de dialogue de recherche Web firefox-search.sh ), mais cette fois, il est converti en Python Je vais vous présenter le transplanté. Je l'ai fait pour étudier Gtk.

Le concept global est le même que lorsqu'il a été créé avec un script shell, mais cette fois nous l'avons amélioré pour qu'il complète automatiquement les caractères tapés en utilisant l'historique.

Gtk.EntryCompletion

Il peut être facilement implémenté en utilisant Gtk.EntryCompletion de gi.repository.

gtk.EntryCompletion: 16.4. EntryCompletion Objects:

Cependant, je l'ai trouvé sur Github car il ne peut pas traduire pour chaque mot séparé par des espaces.

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

Sur la base de, j'ai changé la règle afin que la conversion soit effectuée pour chaque mot séparé par un espace. Merci evoL. Au fait, la 50ème ligne du site ci-dessus

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

Doit être supprimé. Si tel est le cas, les mots-clés complétés en frappant à mi-chemin seront saisis deux fois.

(Si vous tapez "ubu" et sélectionnez "ubuntu", "ubuntu ubuntu" sera entré.)

Composition etc.

De plus, cette fois, pour en faire une application, j'ai essayé de diviser les fichiers et de gérer les paramètres dans des fichiers séparés. Comme toute la composition

Il peut être utilisé dans divers navigateurs en réécrivant ici config.py, et vous pouvez facilement modifier ou ajouter le site spécifié en option. \ _ \ _ Init \ _ \ _. Py est juste un fichier nécessaire pour le gérer en tant que module, et cette fois il est vide. Il semble préférable de traiter la vérification de version ici.

De plus, j'ai récemment appris à utiliser Git facilement, j'ai donc donné le code à GitHub.

http://github.com/ssh0/web_search Il est correct de cloner et de fourcher.

Convivialité

Lorsque vous exécutez websearch.py,

Selection_005_20140921203310ded.png

Une simple zone de saisie comme celle-ci apparaît et lorsque vous saisissez des caractères, elle se comporte comme le début d'un article. Si vous appuyez sur la touche Entrée après avoir terminé la saisie, les résultats de la recherche seront affichés dans un nouvel onglet du navigateur spécifié dans config.py.

Tâche

À l'avenir, j'aimerais ajouter une fonction qui prédit et affiche les mots associés à partir du degré de pertinence des mots, comme une barre de recherche Web générale. De plus, comme les fautes de frappe sont sévères (l'une des raisons pour lesquelles j'ai fait celle-ci), j'aimerais avoir une fonction pour supprimer les erreurs. Il existe également un moyen d'emprunter le moteur de recherche de Google tel quel. De plus, il semble que les fonctions du shell peuvent être facilement implémentées. S'agit-il d'une recherche de fichiers comme utilisation? Vous pouvez faire la même chose avec l'objectif d'Unity, qui est l'environnement de bureau d'Ubuntu, mais il est lourd, il est donc désactivé maintenant. Si c'est aussi simple que d'exécuter la localisation, il peut être plus léger et plus confortable de l'intégrer ici.

Quoi qu'il en soit, le jour est venu où mon historique de recherche, qui n'était pas utile jusqu'à présent, est utile.

J'ai aussi eu le sentiment que Gtk pouvait faire quelque chose. Je veux toucher à diverses choses à l'avenir.

Code entier

Enfin, exposez le code. Quant à l'explication, vous pouvez comprendre ce que vous faites en regardant les commentaires. Reportez-vous ensuite à la référence officielle ci-dessus. J'apprécierais tout conseil ou tsukkomi.

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:recherche Google
        "default-search": r"https://www.google.co.jp/#q=%s",

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

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

        # "p":Recherche d'images Google
        #"-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":Rechercher sur Youtube
        "-y": r"http://www.youtube.com/results?search_query=%s&sm=3",

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

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

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

prediction.py


#!/usr/bin/env python
# -*- coding:utf-8 -*-
#
# written by ssh0, September 2014
#référence: 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

Postscript

2014/09/24: Dans websearch.py, si "," etc. sont inclus, cela ne fonctionnera pas correctement, j'ai donc ajouté une double citation aux deux extrémités de l'adresse et je l'ai passée. Cela effectuera la conversion de caractères nécessaire du côté du navigateur.

Recommended Posts

Boîte de dialogue de recherche Web qui peut automatiquement compléter et saisir des mots-clés [Python] [Gtk]
Rechercher et télécharger automatiquement des vidéos YouTube avec Python
Créons une application capable de rechercher des images similaires avec Python et Flask Part1
Créons une application capable de rechercher des images similaires avec Python et Flask Part2
Comment démarrer un serveur WEB simple qui peut exécuter des cgi de php et python
[Python] Recherche de priorité de profondeur et recherche de priorité de largeur
Rationalisez la recherche Web avec Python