繁体   English   中英

Python 屏幕截图

[英]Python Screen capture

我正在尝试编写一个程序来使用全局热键截取屏幕截图。 下面是对应的代码:

from datetime import datetime
import os
from pynput import keyboard
import pyautogui
import pathlib

def on_activate():
    today = datetime.now()
    d = today.strftime("%Y-%m-%d-%H-%M-%S")
    myScreenshot = pyautogui.screenshot(region=(200,200, 1720, 800))
    time_stamp = '{:%y%d%m}'.format(today)
    fpath = pathlib.Path("C:","Users","Desktop","TestScreenCap", time_stamp)
    if not os.path.exists(fpath):
        os.makedirs(fpath)
    myScreenshot.save(pathlib.Path(fpath,d,".jpg"))

def for_canonical(f):
    return lambda k: f(l.canonical(k))

hotkey = keyboard.HotKey(
    keyboard.HotKey.parse('<ctrl>+<alt>+h'),
    on_activate)
with keyboard.Listener(
        on_press=for_canonical(hotkey.press),
        on_release=for_canonical(hotkey.release)) as l:
    l.join()

错误信息:

Unhandled exception in listener callback
Traceback (most recent call last):
  File "C:\Users\PycharmProjects\untitled1\venv\lib\site-packages\PIL\Image.py", line 2138, in save format = EXTENSION[ext]
KeyError: ''

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "C:\Users\PycharmProjects\untitled1\venv\lib\site-packages\pynput\_util\__init__.py", line 211, in inner
    return f(self, *args, **kwargs)
  File "C:\Users\PycharmProjects\untitled1\venv\lib\site-packages\pynput\keyboard\_win32.py", line 280, in _process self.on_press(key)
  File "C:\Users\PycharmProjects\untitled1\venv\lib\site-packages\pynput\_util\__init__.py", line 127, in inner
    if f(*args) is False:
  File "C:/Users/PycharmProjects/untitled1/123.py", line 18, in <lambda>
    return lambda k: f(l.canonical(k))
  File "C:\Users\PycharmProjects\untitled1\venv\lib\site-packages\pynput\keyboard\__init__.py", line 182, in press
    self._on_activate()
  File "C:/Users/PycharmProjects/untitled1/123.py", line 15, in on_activate
    myScreenshot.save(pathlib.Path(fpath,d,".jpg"))
  File "C:\Users\PycharmProjects\untitled1\venv\lib\site-packages\PIL\Image.py", line 2140, in save
    raise ValueError("unknown file extension: {}".format(ext)) from e
ValueError: unknown file extension: 
Traceback (most recent call last):
  File "C:\Users\PycharmProjects\untitled1\venv\lib\site-packages\PIL\Image.py", line 2138, in save
    format = EXTENSION[ext]
KeyError: ''

上述异常是以下异常的直接原因:

Traceback (most recent call last):
  File "C:/Users/PycharmProjects/untitled1/123.py", line 26, in <module>
    l.join()

  File "C:\Users\PycharmProjects\untitled1\venv\lib\site-packages\pynput\_util\__init__.py", line 259, in join
    six.reraise(exc_type, exc_value, exc_traceback)

  File "C:\Users\PycharmProjects\untitled1\venv\lib\site-packages\six.py", line 702, in reraise
    raise value.with_traceback(tb)
  File "C:\Users\PycharmProjects\untitled1\venv\lib\site-packages\pynput\_util\__init__.py", line 211, in inner
    return f(self, *args, **kwargs)
  File "C:\Users\PycharmProjects\untitled1\venv\lib\site-packages\pynput\keyboard\_win32.py", line 280, in _process
    self.on_press(key)
  File "C:\Users\PycharmProjects\untitled1\venv\lib\site-packages\pynput\_util\__init__.py", line 127, in inner
    if f(*args) is False:
  File "C:/Users/PycharmProjects/untitled1/123.py", line 18, in <lambda>
    return lambda k: f(l.canonical(k))
  File "C:\Users\PycharmProjects\untitled1\venv\lib\site-packages\pynput\keyboard\__init__.py", line 182, in press
    self._on_activate()
  File "C:/Users/PycharmProjects/untitled1/123.py", line 15, in on_activate
    myScreenshot.save(pathlib.Path(fpath,d,".jpg"))
  File "C:\Users\PycharmProjects\untitled1\venv\lib\site-packages\PIL\Image.py", line 2140, in save
    raise ValueError("unknown file extension: {}".format(ext)) from e
ValueError: unknown file extension:
 

我不知道如何将图像保存到文件夹中。 我希望下面的代码不起作用:

myScreenshot.save(pathlib.Path(fpath,d,".jpg"))

使用简单的操作将函数更改为on_activate ,例如:

Print("Hello")

热键脚本完美运行。

我是编程新手,因此感谢您的帮助!

这里是固定代码:

from datetime import datetime
import os
from pynput import keyboard
import pyautogui
import pathlib

def on_activate():
    today = datetime.now()
    d = today.strftime("%Y-%m-%d-%H-%M-%S")
    myScreenshot = pyautogui.screenshot(region=(200,200, 1720, 800))
    time_stamp = '{:%y%d%m}'.format(today)
    fpath = pathlib.Path("C:\\","Users","Desktop","TestScreenCap", time_stamp)
    if not os.path.exists(fpath):
        os.makedirs(fpath)
    myScreenshot.save(pathlib.Path(fpath,d + ".jpg"))

def for_canonical(f):
    return lambda k: f(l.canonical(k))

hotkey = keyboard.HotKey(
    keyboard.HotKey.parse('<ctrl>+<alt>+h'),
    on_activate)
with keyboard.Listener(
        on_press=for_canonical(hotkey.press),
        on_release=for_canonical(hotkey.release)) as l:
    l.join()

问题是您正在使用:

myScreenshot.save(pathlib.Path(fpath,d,".jpg"))

函数pathlib.Path(fpath,d,".jpg")加入将\\添加到每个末尾的字符串,因此您尝试保存文件的路径是:

C:Users\\Desktop\\TestScreenCap\\200309\\2020-09-03-16-50-20\\.jpg

如您所见,文件名是扩展名,会引发异常。

只需替换为: myScreenshot.save(pathlib.Path(fpath,d + ".jpg"))

指定路径上的另一个问题是C:被解释为Drive,所以当你保存函数的时候,是保存到你程序当前运行的路径,而不是真正的指定路径。 要修复此部分,只需将C:替换为C:\\\\

阅读您的代码我认为您想将屏幕截图保存在当前用户桌面中,如果是这样,请替换该行: fpath = pathlib.Path("C:\\\\","Users","Desktop","TestScreenCap", time_stamp)fpath = pathlib.Path(os.path.join(os.path.join(os.environ['USERPROFILE']), 'Desktop'), time_stamp)并在顶部添加import os 有了这个,你就不需要关心路径的正确生成了。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM