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.)
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.
Wenn Sie websearch.py ausführen,
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.
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.
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
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