Есть ли способ имитировать эффект функции time.sleep() без остановки всей программы?

#python #python-3.x #time #while-loop

#python #python-3.x #время #while-цикл

Вопрос:

Я новый пользователь python 3.9, который пытается улучшить мое кодирование. Я пишу программу, которая использует цикл while и будет вызывать функции для нажатия клавиш на основе пользовательского ввода. Мой код в основном выглядит так:

 from pynput.keyboard import Key, Controller
from graphics import *
import time
    
def wack():
   M = Controller()
   for i in range(3):
      M.press('a')
      time.sleep(1)    # This guy right here is the issue
      M.release('a')

def main():
    click = Win.checkMouse()
    while not click(click, exit_box):
       click = Win.checkMouse()
       if *input* == *correct string*:
          wack()
       
 

У меня есть графическое окно с кнопкой выхода, и при нажатии кнопки выхода программа завершает работу и закрывает окно. Проблема в том, что time.sleep(1) он не приостанавливает ввод или эту точку в коде, он приостанавливает всю программу, приостанавливая цикл while, что не то, что я хочу, чтобы он делал.

Поиск по функции time не дал никаких четких решений, поскольку time.sleep() , по-видимому, это самая популярная функция приостановки в python.

Комментарии:

1. Я перечитывал это несколько раз, но это немного расплывчато. Когда вы говорите «графическое окно», вы имеете в виду видеоигру, например, вы пытаетесь создать бота? Кроме того, для time.sleep все, что делается, это пауза в программе, поэтому в цикле for внутри функции wack все, что когда-либо будет делать sleep, — это пауза в этой строке, то есть все, что делает time.sleep . Он спит в этой строке кода в течение заданного промежутка времени, а затем запускается снова, если вы не пытаетесь этого сделать, это неправильно использовать. Итак, чего вы пытаетесь достичь от начала до конца, это может быть дополнительной помощью.

2. @NewCoder18 От начала до конца этот код принимает пользовательский ввод в виде предустановленных кодов. Затем код активируется, и кнопка ввода нажимается непрерывно. Весь смысл этого в том, чтобы быть тренером, который я могу использовать в эмулируемой игре Pokemon. Таким образом, пользователь нажимает на графическое окно, созданное программой, вводит свой код и все еще может взаимодействовать с окном, пока код работает в фоновом режиме.

Ответ №1:

asyncio добавлена удивительная функция python3.7 , которая позволяет вам ждать, пока объект или функция (вызываемая coroutine в контексте асинхронного python) получат результат, пока выполняется остальная часть программы.

asyncio имеет метод sleep, который приостанавливает только асинхронную функцию ( coroutine ) и позволяет выполнить остальной код в программе

Вот как:

 from pynput.keyboard import Key, Controller
from graphics import *
import time
import asyncio

#This is the asnychronous funtion    
async def wack():
   M = Controller()
   for i in range(3):
      M.press('a')
      await asyncio.sleep(1)#this sleeps the function but allows the rest of the program to work
      M.release('a')

def main():
    click = Win.checkMouse()
    while not click(click, exit_box):
       click = Win.checkMouse()
       if *input* == *correct string*:
          asyncio.run(wack()) #calling the asynchronous funtion
       
 

Вот руководство по пониманию asyn io для python