Python3.6 и Pyautogui - Пиксельные команды - TypeError: __new __ () принимает 4 позиционных аргумента, но было дано 5 - PullRequest
0 голосов
/ 25 февраля 2019

Я относительно новичок в Python и пытаюсь сделать забавный маленький проект, используя Pyautogui и Python3.6 .Целью этого проекта является создание проекта с тензорным потоком, который учится играть в шахматы.Проблема, с которой я сейчас сталкиваюсь, заключается в том, что всякий раз, когда я пытаюсь использовать любую из команд pixel - например, pyautogui.pixel (...) или screenshot.getpixel (...) - появляется сообщение об ошибкеэто:

Traceback (most recent call last):
  File "main.py", line 109, in <module>
    Score()
  File "main.py", line 100, in Score
    if gui.pixelMatchesColor(tempX, tempY, (87, 83, 82), tolerance=20):
  File "/Users/student/Library/Python/3.6/lib/python/site-packages/pyscreeze/__init__.py", line 413, in pixelMatchesColor
    pix = pixel(x, y)
  File "/Users/student/Library/Python/3.6/lib/python/site-packages/pyscreeze/__init__.py", line 436, in pixel
    return RGB(*screenshot().getpixel((x, y)))
TypeError: __new__() takes 4 positional arguments but 5 were given

Я просто хочу заметить, что все остальные команды работают нормально и что только pixel те, которые не работают.

Я установилвсе, включая pyautogui (duh), pyscreeze, pymsgbox, pytweening, xlib, opencv и любой другой пакет, который я мог придумать.Они были установлены с помощью этой команды: pip3 install имя-пакета-здесь - пользователь .Мне нужен был - пользователь , потому что у меня в настоящее время нет прав администратора на мой компьютер, поэтому мне интересно, может ли это быть как-то связано с моим текущим затруднением.

Я также столкнулсяболее ранний пост в моем поиске ответа, но я забыл, где я его нашел, поэтому извините, но я не могу связать его, но в основном он сказал, что я должен пройти и удалить все папки pycache ,Я сделал это с помощью команды терминала в папке ~ / Library / Python / 3.6:

find . -name "__pycache__" -type f -o -name "__pycache__" -type d -exec rm -rf {} \

Мне не нужно точное решение этой проблемы, но мне интересно, есть ли какой-нибудь способиспользуйте функцию pyautogui.pixelMatchesColor (...) или любую аналогичную, которую вы рекомендуете , которая может иметь допуск - например, значения RGB могут быть на 10 единиц отключены и по-прежнему возвращать true .

Для тех из вас, кто заинтересован, вот мой полный код:

#
# IMPORT ALL NECESSARY THINGS
#

import os, time, sys, pyautogui as gui, argparse as arg

#
# FAILSAFES
#

gui.FAILSAFE = True
gui.PAUSE = 0.1

#
# SET UP ARGUEMENT PARSER
#

parser = arg.ArgumentParser(description='A machine learning script powered by TensorFlow designed to be run on "chess.com" using Python.')
parser.add_argument("-s", "--sleep", nargs='?', type=int, default='5', help='Number of seconds that the program should sleep before starting. This gives you time to move over to the website before the program looks for the gamboard on screen.')
args = parser.parse_args()

#
# ASKS USER FOR WHAT SIDE IT IS ON
#

side = input("Are you white or black?  ")

if side == "W" or side == "w" or side == "white" or side == "White":
     side = "W"
elif side == "B" or side == "b" or side == "black" or side == "Black":
    side = "B"
else:
    print("Invalid selection for which side!")
    side = None
    sys.exit(0)

#
# PRINT "READY" AND THEN WAIT FOR SPECIFIED AMOUNT OF TIME - DEFAULT 5 SECONDS
#

print("Ready! Waiting for " + str(args.sleep) + " seconds!")
time.sleep(int(args.sleep))

#
# GET AREA OF GAMEBOARD ON SCREEN
#

if side == "W":
    gameboard = gui.locateOnScreen('./img/white/chessboard_white.png', confidence=0.55, grayscale=True)
    left = gameboard.left - 10
    top = gameboard.top - 5
    right = gameboard.left + gameboard.width + 10
    bottom = gameboard.top + gameboard.height + 15
elif side == "B":
    gameboard = gui.locateOnScreen('./img/black/chessboard_black.png', confidence=0.55, grayscale=True)
    left = gameboard.left - 10
    top = gameboard.top - 5
    right = gameboard.left + gameboard.width + 10
    bottom = gameboard.top + gameboard.height + 15

widthInterval = (right - gameboard.left) / 8
heightInterval = (bottom - gameboard.top) / 8

#
# DEFINES A FUNCTION THAT COUNTS THE SCORE 
# - NUMBER OF YOU SIDE AND THEN SUBTRACT THE NUMBER OF OPPOSITE SIDE
#

def Score():
    for i in range(8):
        for j in range(8):
            tempX = 32 + (i * widthInterval)
            tempY = 32 + (j * heightInterval)
            if gui.pixelMatchesColor(tempX, tempY, (87, 83, 82), tolerance=20):
                print("True!")

    if side == "W":
        print("White!")
    elif side == "B":
        print("Black!")


Score()

Примечание: проблема возникает в последних 10-ти строках приведенного выше кода.

Большое спасибо за вашу помощь и, пожалуйста, не стесняйтесь, дайте мне знать, если вам нужна дополнительная информация от меня!Max

...