Есть ли способ напрямую указать моей программе на python использовать мышь с os.system («import filename.png»)?

#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 будет фокусироваться на вновь созданном окне).