Задать вопрос
limontasher
@limontasher
Начинающий программист

Ошибка интерпритатора python'a или моего мозга?

Вообщем, решил написать авто-бота на пайтоне, пишу пишу, и делаю активаю/деактивацию, и тут пайтон выдает что переменная не видится в функции, но я ее делаю глобальной, созрел вопрос? Код:
import pyautogui
import keyboard
from threading import Thread
from time import sleep

def Run():
    i = 0
    while switch:
        pass

def Click():
    while switch:
        pyautogui.click()
        sleep(1)

def Switch():
    while True:
        if keyboard.is_pressed('End'):
            if switch:
                switch = False
                pyautogui.keyUp('shift')
            else:
                switch = True
                pyautogui.keyDown('shift')

global switch
switch = False

thread1 = Thread(target=Switch)
thread2 = Thread(target=Run)
thread3 = Thread(target=Click)

thread1.start()
thread2.start()
thread3.start()

thread1.join()
thread2.join()
thread3.join()

60639b3ec352e411661171.png
  • Вопрос задан
  • 128 просмотров
Подписаться 1 Средний 1 комментарий
Решения вопроса 1
ri_gilfanov
@ri_gilfanov
Web- and desktop-developer
Кажется Вы неправильно поняли как работает оператор global.

Для начала, прочитайте про LEGB в Python.

Если к именам из глобальной области ниже происходит обращение на чтение -- использовать оператор global не имеет смысла.

Если именам из глобальной области во вложенном пространстве имён присваиваются другие объекты -- нужно объявить во вложенном пространстве оператор global и перечислить имена из глобальной области через запятую.

Аналогично с объёмлющими (англ. enclosed) областями -- для них предусмотрен оператор nonlocal.

Касательно вашего кода, попробуйте изменить так:
import pyautogui
import keyboard
from threading import Thread
from time import sleep


switch = False


def Run():
    global switch
    i = 0
    while switch:
        pass

def Click():
    global switch
    while switch:
        pyautogui.click()
        sleep(1)

def Switch():
    global switch
    while True:
        if keyboard.is_pressed('End'):
            if switch:
                switch = False
                pyautogui.keyUp('shift')
            else:
                switch = True
                pyautogui.keyDown('shift')


thread1 = Thread(target=Switch)
thread2 = Thread(target=Run)
thread3 = Thread(target=Click)

thread1.start()
thread2.start()
thread3.start()

thread1.join()
thread2.join()
thread3.join()
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@UberPool
Python/JS coder
Что за чушь ты пишешь?Какая ошибка интерпретатора.Переменную нужно создать глобально и зачем ты используешь global
Приведу пример:
test = 0

def add_user():
    print(test)


Если что-то не понятно спрашивай

Почитай про global и старайся не использовать его
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы