Кажется Вы неправильно поняли как работает оператор
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()