Отображение изображения на черном полноэкранном фоне, закрытие при любом пользовательском событии

Я просто пишу небольшой вспомогательный скрипт для преобразования содержимого буфера обмена X в QR-код и отображения результата, чтобы я мог сканировать код с помощью своего смартфона.

В принципе, эта строка bash работает (с обработкой ошибок это десять строк):

xclip -o | qrencode -s 5 -o - | display -backdrop -background "#000"

Я получаю QR-код в центре полноэкранного черного фона. Ницца. Но у утилиты отображения GraphicsMagick есть одна проблема с удобством использования в этом сценарии: я не могу легко выйти из нее. Мне нужно щелкнуть правой кнопкой мыши по изображению (не по фону) и выбрать последний элемент в меню, текст которого теперь отображается черным на черном.

Я вижу несколько подходов к этой проблеме, но не вижу решения ни для одного из них:

  1. Получите утилиту display от GraphicsMagick, чтобы она закрывалась при любом событии, будь то щелчок мышью или нажатие клавиши.
  2. Запустите display в фоновом режиме и каким-то образом поймайте события пользовательского интерфейса. Затем убейте display.
  3. Используйте другой просмотрщик изображений, который легче закрыть. Не нашел ни одного с функцией фона.

По сути, то, что я ищу, - это простой способ отображения изображения из сценария bash, центрированного на текущем экране X с черным фоном (бонус: полупрозрачный черный фон), убираемого щелчком мыши или нажатием клавиши. Кроме того, некоторая текстовая подпись в произвольной форме под изображением была бы хороша, поэтому мне не пришлось бы возиться с GraphicsMagick, чтобы добавить ее к изображению.


person orithena    schedule 11.05.2013    source источник


Ответы (1)


Хорошо, каким-то образом я сам написал эту программу просмотра изображений... на лету... со встроенным python и Tkinter. Если кто-то хочет его использовать, и python, встроенный в bash, не слишком страшная идея, вот мой bash-скрипт «Clipboard to QR Code». Сохраните его где-нибудь, сделайте его исполняемым и зарегистрируйте его в среде рабочего стола для запуска по ‹Ctrl-Q› или назначьте стартер на своей панели.

Зависимости: python python-tk qrencode xclip

#!/bin/bash

TMPDIR=$(mktemp -d)
trap 'rm -rf $TMPDIR; exit 1' 0 1 2 3 13 15

if xclip -o | qrencode -s 2 -m 2 -o - > $TMPDIR/qrcode.png
then 
    TXT=$(xclip -o)
elif xclip -o -selection clipboard | qrencode -s 2 -m 2 -o - > $TMPDIR/qrcode.png
then
    TXT=$(xclip -o -selection clipboard)
else
    STXT=$( echo "$(xclip -o)" | head -n 1 | cut -c 1-50 )
    notify-send -i unknown "Conversion Error" "Cannot provide a QR Code for the current clipboard contents:\
    \
    $STXT ..."
    exit 0
fi
echo "$TXT" > $TMPDIR/content.txt
python - <<PYEND 
import Tkinter,Image,ImageTk
tk = Tkinter.Tk()
tk.geometry("%dx%d+0+0" % (tk.winfo_screenwidth(), tk.winfo_screenheight()))
tk.wm_focusmodel(Tkinter.ACTIVE)
def handler(event):
    tk.quit()
    tk.destroy()
tk.bind("<Key>", handler)   
tk.bind("<KeyPress>", handler)
tk.bind("<Button>", handler)
tk.protocol("WM_DELETE_WINDOW", tk.destroy)
txt = ""
tkim = None
try:
    img = Image.open("$TMPDIR/qrcode.png").convert()
    while (img.size[1] < tk.winfo_screenheight() * 0.4) and (img.size[0] < tk.winfo_screenwidth() * 0.45):
        img = img.resize(([x*2 for x in img.size]), Image.NONE)
    tkim = ImageTk.PhotoImage(img)
    txt = file("$TMPDIR/content.txt").read()
except Exception as e:
    txt = "Error while retrieving text: " + str(e)

lh = Tkinter.Label(tk, text="QR Code from Clipboard", font=("sans-serif", 12), background="#000", foreground="#FFF", justify=Tkinter.CENTER).pack(fill=Tkinter.BOTH, expand=1)
li = Tkinter.Label(tk, image=tkim, background="#000", foreground="#FFF", justify=Tkinter.CENTER).pack(fill=Tkinter.BOTH, expand=1)
lt = Tkinter.Label(tk, text=txt, font=("sans-serif", 9), background="#000", foreground="#FFF", justify=Tkinter.LEFT, wraplength=tk.winfo_screenwidth()*0.9).pack(fill=Tkinter.BOTH, expand=1)
tk.overrideredirect(True)
tk.lift()
tk.focus_force()
tk.grab_set()
tk.grab_set_global()
tk.mainloop() 
PYEND
rm -rf $TMPDIR
trap 0 1 2 3 13 15

Обновление: теперь также на GitHub: https://github.com/orithena/clip2qr

person orithena    schedule 11.05.2013