Python

Мне нужно чтобы из template1 и template2 передавались данные в screen1 и screen2

 import tkinter as tk 
from tkinter import ttk
import mouse
import keyboard
import time
import pyautogui
from PIL import Image, ImageChops
import pytesseract
import cv2

def JB():
w = False
IsAlive = True

template1 = pyautogui.locateOnScreen('offline.png')
template2 = pyautogui.locateOnScreen('online.png')
def difference_images():
global w
global template1
global template2
pytesseract.pytesseract.tesseract_cmd = r"C:\Program Files\Tesseract-OCR\tesseract.exe"

img1 = cv2.imread('offline.png')
img1 = cv2.cvtColor(img1, cv2.COLOR_BGR2RGB)

img2 = cv2.imread('online.png')
img2 = cv2.cvtColor(img2, cv2.COLOR_BGR2RGB)

img3 = cv2.imread('screenshot.png')
img3 = cv2.cvtColor(img3, cv2.COLOR_BGR2RGB)


config = r'--oem 3 --psm 6'
f = pytesseract.image_to_string(img1, config=config)

config = r'--oem 3 --psm 6'
b = pytesseract.image_to_string(img2, config=config)

config = r'--oem 3 --psm 6'
c = pytesseract.image_to_string(img3, config=config)


screen1 = pyautogui.screenshot('screenshot.png',region=(template1))
screen2 = pyautogui.screenshot('screenshot.png',region=(template2))


if f == c:
mouse.click(button='left')
time.sleep(0.01)
elif f != c:
w = False
elif b == c:
w = False
elif b != c:
mouse.click(button='left')
time.sleep(0.01)
def sc():
global w
if w:
w = True
else:
w = False
# Создание скриншота


if button.cget("text") == "Старт":
button.config(text="Стоп")
# Здесь выполняется ваша функция
else:
button.config(text="Старт")
# Остановка выполнения функции


# Основной цикл программы
while IsAlive:


#Terminate()

# Сравнение изображений
difference_images()


root = tk.Tk()
root.title("Job Bot") # устанавливаем заголовок окна
root.geometry("300x250") # устанавливаем размеры окна

label = tk.Label(text="Чтобы начать нажмите старт") # создаем текстовую метку
label.pack() # размещаем метку в окне

button = tk.Button(root, text="Старт", command=JB)
button.pack()

root.mainloop()
можно ли это как-то сделать?
Вместо
 global w, template1, template2  
попробуй
 nonlocal w, template1, template2 
Pato ;x
Pato ;x
12 091
Лучший ответ
 import tkinter as tk 
import mouse
import time
import pyautogui
import cv2
import pytesseract

def difference_images(template1, template2):
# Остальной код функции difference_images оставляем без изменений
# ...

def JB():
w = False
IsAlive = True

template1 = pyautogui.locateOnScreen('offline.png')
template2 = pyautogui.locateOnScreen('online.png')

# Остальной код функции JB оставляем без изменений
# ...

# Вместо вызова difference_images() просто передаем template1 и template2 как аргументы
difference_images(template1, template2)

# ...

root = tk.Tk()
root.title("Job Bot")
root.geometry("300x250")

label = tk.Label(text="Чтобы начать нажмите старт")
label.pack()

button = tk.Button(root, text="Старт", command=JB)
button.pack()

root.mainloop()
У вас возникли проблемы с этим кодом, потому что ваши функции difference_images и JB не могут обмениваться данными напрямую. Чтобы исправить это, я предложу следующие изменения: сохраните template1 и template2 в глобальные переменные и используйте их в функции difference_images таким образом:
 global template1  
global template2
try:
template1 = pyautogui.locateOnScreen('offline.png')
template2 = pyautogui.locateOnScreen('online.png')
except TypeError as e:
template1 = None
template2 = None

# later in your code
if template1 is not None and template2 is not None:
screen1 = pyautogui.screenshot('screenshot.png', region=(*template1,))
screen2 = pyautogui.screenshot('screenshot2.png', region=(*template2,))
Здесь я также добавил обработку TypeError, который будет подниматься, если pyautogui.locateOnScreen не сможет найти изображение и вернет None.

Примечание: в коде используется оператор (*) для раскрытия кортежа. При использовании этого оператора python автоматически преобразует кортеж (a, b, c, d) в последовательность аргументов a, b, c, d, которые можно передать в функцию.
Да, вы можете передать данные из template1 и template2 в screen1 и screen2, чтобы использовать их в других функциях или местах в вашем коде.Да, вы можете передать данные из template1 и template2 в screen1 и screen2, чтобы использовать их в других функциях или местах в вашем коде.

import tkinter as tk
import pyautogui

# Объявляем переменные для хранения областей для скриншотов
template1 = None
template2 = None

def JB():
global template1, template2

w = False
IsAlive = True

# Используем глобальные переменные для хранения областей, найденных с помощью pyautogui.locateOnScreen()
template1 = pyautogui.locateOnScreen('offline.png')
template2 = pyautogui.locateOnScreen('online.png')

# ...

# В функции difference_images() используйте template1 и template2 для скриншотов
screen1 = pyautogui.screenshot('screenshot1.png', region=template1)
screen2 = pyautogui.screenshot('screenshot2.png', region=template2)

# ...

root = tk.Tk ()
root.title("Job Bot")
root.geometry("300x250")

label = tk.Label(text="Чтобы начать нажмите старт")
label.pack()

button = tk.Button(root, text="Старт", command=JB)
button.pack()

root.mainloop()