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é.)
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.
Lorsque vous exécutez websearch.py,
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.
À 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.
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
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