#python #bash #archlinux #i3
#python #bash #archlinux #i3
Вопрос:
Я пытался написать небольшой скрипт для создания скриншотов для arch. Это работает, но проблема в том, что когда я пытаюсь назначить ему привязку клавиш в моем i3-config, он ничего не делает.
Сначала я попытался полностью написать его в bash, который работал нормально, но я наткнулся на ту же проблему, когда он не выполнялся. Итак, я перенаправил вывод в файл журнала, чтобы проверить его, и он приветствует меня этим:
import: unable to grab mouse '': Datei oder Verzeichnis nicht gefunden @ error/xwindow.c/XSelectWindow/9306.
import: unable to read X window image '': Erfolg @ error/xwindow.c/XImportImage/4942.
import: unable to read X window image '': Erfolg @ error/xwindow.c/XImportImage/5049.
import: `/home/lukas/Screenshot/20190419/scoot7.png' @ error/import.c/ImportImageCommand/1288.
Перевод первой строки: не удалось найти файл или каталог @ ошибка […]
Перевод Erfolg: успех
Я попытался погуглить, что ни к чему не привело, и я действительно не нашел никакого пути, похожего на error / xwindow.c и так далее.
Вот мой код:
#!/usr/bin/env python
import os, os.path
import datetime
import sys
d = datetime.datetime.today()
directory="/home/lukas/Screenshot/%s"%d.strftime('%Y%m%d')
if not os.path.exists(directory):
os.mkdir(directory)
fileCount = 1
for file in os.listdir(directory):
if file.endswith('.png'):
fileCount =1
filename = "%s/scr%d.png"%(directory,fileCount)
os.system("import %s"%filename)
и вот моя запись в моей конфигурации i3:
bindsym $mod Shift F12 exec --no-startup-id scoot > /tmp/log.out 2>amp;1
Ожидаемый результат этого заключается в том, что когда я нажимаю mod shift f12, он должен преобразовать мой указатель мыши в «перекрестие», чтобы я мог что-то выбрать и сделать снимок экрана.
Фактический результат заключается в том, что если я запускаю его нормально, он работает, но если я пытаюсь использовать сочетание клавиш, оно просто ничего не делает, кроме вывода в мой файл журнала.
Я в значительной степени новичок в программировании и Linux, и я понятия не имею, почему он не может найти мою мышь, и я хотел знать, могу ли я явно указать программе использовать ее или есть другой способ сделать это.
Большое спасибо.
Hugenotte
Ответ №1:
Некоторое время назад я написал скрипт bash, чтобы сделать именно то, что вы пытаетесь сделать, используя очень распространенную утилиту ImageMagick, которую вы можете найти здесь, на Arch .
Вот это на случай, если вы открыты для этой альтернативы:
#!/bin/bash
# take screenshot using import from imagemagick
# allows to select the area by dragging across a rectangle
# or to select entire window by clicking inside it
set -e
# the date and time will be used as the file name
time=$(date "%F_%H:%M:%S")
# naming the urxvt window "screenshot" so that the i3 "no_focus" option gets applied to it
urxvt -title "screenshot" -e bash -c "import $HOME/Screenshot/$time.png"
Затем я использую его в i3 с:
no_focus [title="screenshot"]
bindsym $mod Shift F12 layout tabbed; exec --no-startup-id bash my_script.sh
Конечно, вы можете захотеть изменить формат даты на тот, который у вас был в python. Мне нравится иметь время на случай, если я сделаю несколько скриншотов подряд. И вам нужно заменить urxvt
на имя вашего эмулятора терминала, и вам, возможно, придется адаптировать -title
флаг, если ваш эмулятор терминала не дает Windows имя таким образом.
Обратите внимание, что важно присвоить имя окну: мне потребовалось некоторое время, чтобы понять, как обойти то, что происходит, не называя окно и используя no_focus
в этом окне в i3:
Фокус переместится в окно захвата экрана и, следовательно, из окна, из которого я хотел сделать снимок экрана. Возможно, проблема, с которой вы сталкиваетесь с вашими сценариями bash и python, может быть связана с этим. Вы должны заставить i3 удерживать мышь в старом окне и не переходить к окну захвата экрана, запускаемому скриптом (по умолчанию i3 будет фокусироваться на вновь созданном окне).