bbox работает при вводе точных координат внутри модуля, но не работает с переменной, содержащей идентичные данные - PullRequest
0 голосов
/ 01 октября 2019

У меня возникла проблема при попытке сделать снимок экрана области, определенной строками в файле конфигурации:

Следующий код:

def coordstore():                                 # check line 1 of config file (screencap name)
    f=open('config.txt')
    line=f.readlines()
    coordstore.x1,coordstore.y1,coordstore.x2,coordstore.y2 = (line[4]).strip(),(line[5]).strip(),(line[6]).strip(),(line[7]).strip()    # note: confusing.  0=line 1, 1=line2 etc.
    coordstore.coords = coordstore.x1+',',coordstore.y1+',',coordstore.x2+',',coordstore.y2
    coordstore.stripped = ' '.join((coordstore.coords))
    print(coordstore.stripped)
    return(coordstore.stripped)
coordstore()

def screenshot():
    import pyscreenshot as ImageGrab2
    # part of the screen
    if __name__ == '__main__':
        im = ImageGrab2.grab(bbox=(coordstore.stripped))  # X1,Y1,X2,Y2
        im.save('tc.png')
screenshot()

печатает именно это значение:10, 20, 100, 300

затем происходит сбой с этой трассировкой:

Traceback (most recent call last):
  File "file location", line 82, in <module>
    screenshot()

  File "file location", line 80, in screenshot
    im = ImageGrab2.grab(bbox=(coordstore.stripped))  # X1,Y1,X2,Y2

  File "PYCHARM\venv\lib\site-packages\pyscreenshot\__init__.py", line 67, in grab
    to_file=False, childprocess=childprocess, backend=backend, bbox=bbox)

  File "PYCHARM\venv\lib\site-packages\pyscreenshot\__init__.py", line 38, in _grab
    x1, y1, x2, y2 = bbox
ValueError: too many values to unpack (expected 4)

Если я вручную заменю (bbox = (ordinstore.stripped)) на (bbox = (10, 20, 100, 300)), который буквально идентичен тому, что печатает переменная, код работает отлично, но не подходит для моих нужд. Что я не вижу? Спасибо за помощь!

ОБНОВЛЕНИЕ:

Я попробовал другой подход.

def coordstore():                                 # check line 1 of config file (screencap name)
    f=open('config.txt')
    line=f.readlines()
    coordstore.x1 = (line[4]).strip()
    coordstore.y1 = (line[5]).strip()
    coordstore.x2 = (line[6]).strip()
    coordstore.y2 = (line[7]).strip()
    print(coordstore.x1+',', coordstore.y1+',', coordstore.x2+',', coordstore.y2)
    return(coordstore.x1, coordstore.y1, coordstore.x2, coordstore.y2)
coordstore()

def screenshot():
    import pyscreenshot as ImageGrab2
    # part of the screen
    if __name__ == '__main__':
        im = ImageGrab2.grab(bbox=(coordstore.x1+',', coordstore.y1+',', coordstore.x2+',', coordstore.y2+','))  # X1,Y1,X2,Y2
        im.save('tc.png')
screenshot()

Это печатает

10, 20, 100, 300

, но возвращает следующие ошибки трассировки:

Traceback (most recent call last):
  File "module location", line 84, in <module>
    screenshot()
  File "module location", line 82, in screenshot
    im = ImageGrab2.grab(bbox=(coordstore.x1+',', coordstore.y1+',', coordstore.x2+',', coordstore.y2+','))  # X1,Y1,X2,Y2
  File "\PYCHARM\venv\lib\site-packages\pyscreenshot\__init__.py", line 67, in grab
    to_file=False, childprocess=childprocess, backend=backend, bbox=bbox)
  File "\PYCHARM\venv\lib\site-packages\pyscreenshot\__init__.py", line 42, in _grab
    raise ValueError('bbox y2<=y1')
ValueError: bbox y2<=y1

1 Ответ

1 голос
/ 01 октября 2019

Как вы упомянули в комментариях, значение coordstore.stripped является строкой. И ожидаемый аргумент ImageGrab2.grab - это тип кортежа, поэтому сначала вы должны преобразовать его в кортеж.

Обновите метод следующим образом:

def screenshot():
    import pyscreenshot as ImageGrab2
    # part of the screen
    if __name__ == '__main__':
        im = ImageGrab2.grab(bbox=tuple(map(int, coordstore.stripped.split(', '))))  # X1,Y1,X2,Y2
        im.save('tc.png')
...