问题是我调用函数 multiProcessCharacters ,它应该创建 3 个进程 3 次,因为它应该检查 3 个字符的 3 个特征。相反,这些进程“完成”并从我的 python 代码的开头重新启动。这是重要的代码,但不是全部:
#同时循环所有角色寻找每个特征组
character = [['1',False],['2',False],['3',False]]
while user!='n':
user=input("Did you want to not roll any characters?\nEnter: 1/2/3/n\n1=Character One\n2=Character Two\n3=Character Three\nn=no\n")
if user=='1':
character[0][1]=True
elif user=='2':
character[1][1]=True
elif user=='3':
character[2][1]=True
elif user=='n':
print("Character rolling will start in 10 seconds!\n")
else:
print("Not a proper input")
#设置主要特征,然后设置你可以接受的次要特征/技能
while mainTraits[0][1]==False or mainTraits[1][1]==False or mainTraits[2][1]==False:
time.sleep(10)
print("Character rolling starts now!\n")
print("Rolling for:\nUnbreakable\nCooking\nIncredible Immune System\n")
for i in range(3):
if character[i][1] == False:
print("Starting character {i}")
whichTrait = multiProcessCharacters(mainTraits,secondaryTraits,character[i][0])
print("Character {i} Done!\n")
if whichTrait == '1':
mainTraits[0][1]=True
elif whichTrait == '2':
mainTraits[1][1]=True
elif whichTrait == '3':
mainTraits[2][1]=True
character[i][1] == True
user=input("Are you happy with these characters? y/n\n")
if user=='n':
traitChosen=False
characterChosen=False
while characterChosen==False:
characterChoice=input("Which character would you like to reroll? 1/2/3\n")
if characterChoice=='1':
character[0][1]=False
characterChosen=True
elif characterChoice=='2':
character[1][1]=False
characterChosen=True
elif characterChoice=='3':
character[2][1]=False
characterChosen=True
while characterChosen==True and traitChosen==False:
traitChoice=input("Which trait would you like to reroll?\nUB\nCook\nISS")
if traitChoice=="UB":
mainTraits[0][1]=False
traitChosen=True
elif traitChoice=="Cook":
mainTraits[2][1]=False
traitChosen=True
elif traitChoice=="ISS":
mainTraits[1][1]=False
traitChosen=True
#检查角色是否具备三个特质
def checkIfThreeTraits(characterLeft, characterRight):
tripleTraitList=list(pyautogui.locateAllOnScreen(tripleTrait, grayscale=True, confidence=0.9))
for i in range(0,len(tripleTraitList)):
if tripleTraitList[i].left>characterLeft and tripleTraitList[i].left<characterRight:
return True
return False
#检查次要特征
def loopSecondaryTraits(mainTraitLoc,character,traits, characterLeft, characterRight):
print("Checking secondary stuff\n")
for trait in traits:
if pyautogui.locateOnScreen(trait, grayscale=True, confidence=0.9) != None:
traitLoc=pyautogui.locateOnScreen(trait, grayscale=True, confidence=0.9)
if traitLoc.left>characterLeft and traitLoc.left<characterRight and traitLoc!=mainTraitLoc:
if checkIfThreeTraits(character)==True:
return True
return False
def searchMainTrait(trait, secondaryTraits, character):
if character=='1':
characterLeft = characterOneLeft
characterRight = characterOneRight
elif character=='2':
characterLeft = characterTwoLeft
characterRight = characterTwoRight
elif character=='3':
characterLeft = characterThreeLeft
characterRight = characterThreeRight
else:
print("Character doesn't exist")
exit(0)
if pyautogui.locateOnScreen(trait, grayscale=True, confidence=0.9) != None:
traitlocOne=pyautogui.locateOnScreen(trait, grayscale=True, confidence=0.9)
if traitlocOne.left>characterLeft and traitlocOne.left<characterRight:
found=loopSecondaryTraits(traitlocOne, character, secondaryTraits)
if found==True:
return True
return False
def multiProcessCharacters(mainTraits, secondaryTraits, character):
traitOne = mainTraits[0][0]
traitTwo = mainTraits[1][0]
traitThree = mainTraits[2][0]
t1Found = mainTraits[0][1]
t2Found = mainTraits[1][1]
t3Found = mainTraits[2][1]
if character=='1':
pyautogui.moveTo(characterOneMousePosition)
elif character=='2':
pyautogui.moveTo(characterTwoMousePosition)
elif character=='3':
pyautogui.moveTo(characterThreeMousePosition)
else:
print("Character doesn't exist")
exit(0)
while t1Found==False or t2Found==False or t3Found==False:
with concurrent.futures.ProcessPoolExecutor() as executor:
if t1Found==False:
print("Process 1 starting")
f1 = executor.submit(searchMainTrait, traitOne, secondaryTraits, character)
print("Process 1 ending")
if t2Found==False:
print("Process 2 starting")
f2 = executor.submit(searchMainTrait, traitTwo, secondaryTraits, character)
print("Process 2 ending")
if t3Found==False:
print("Process 3 starting")
f3 = executor.submit(searchMainTrait, traitThree, secondaryTraits, character)
print("Process 3 ending")
if f1.result()==True:
print("Pair One Done!\n")
return '1'
if f2.result()==True:
print("Pair Two Done!\n")
return '2'
if f3.result()==True:
print("Pair Three Done!\n")
return '3'
pyautogui.press(['t'])
我希望它能够循环并通过按 t 更改 3 个字符。我有可以工作的代码,但问题是它很慢,我希望多重处理能够使其更快地执行循环而不是一次执行一个循环。
我通过添加一个解决了这个问题(注意!!它应该是名称和主要两侧的两个下划线,它们不应该是粗体 __ ):
if name == 'main':
在调用所有内容的主要代码部分前面。只需将其放在主程序的开头一次,如下所示:
if name == 'main':
teamNotMade=真 用户='y'
#Used for if three traits exist tripleTrait = cv2.imread(r"Three_trait.png") #Traits implemented ISSTrait = cv2.imread(r"Traits/IIS_trait.png") UBTrait = cv2.imread(r"Traits/UB_trait.png") APLTrait = cv2.imread(r"Traits/APL_trait.png")