Предмет: Информатика, автор: levaaveryanov

Кто шарит в python нужна помощь, я пишу скрипт который при нажатии space должен дублировать его с определённой переодичностью.
Дублирует то он дублирует, но это продолжается и когда я отпускаю пробел
вот собственно код:

def main():
while True:

if keyboard.is_pressed("space"):
while True:
time.sleep(0.00015)
keyboard.press_and_release("space")
time.sleep(0.030)


main()


avion321321: у вас бесконечный цикл
levaaveryanov: так и задумано, но он должен работать только при зажатом пробеле ,а не всегда
avion321321: вот именно, а он у вас всегда true

Ответы

Автор ответа: KnowsUser1
1

Ответ:

Когда вы нажимаете клавишу пробел, выполняется условие keyboard.is_pressed('space'). Если это условие выполняется, то вы попадаете с бесконечный цикл while True (строка 5).  Вы один раз нажимаете пробел и попадаете в этот бесконечный цикл.  А так как в нём не предусмотрено никаких условий завершения, то он, логично, никогда не завершится. Что бы исправить это, вы можете добавить условие завершения в цикл или изменить условия его выполнения, например:

while keyboard.is_pressed("space"):

   time.sleep(time)

   keyboard.press_and_release("space")

   time.sleep(time)

P.S Не стоит копировать этот код. Я не знаю, какую библиотеку вы используете, и, соответственно, решения проблемы предлагаю "пальцем в небо"


KnowsUser1: Я не знаю, с какой библиотекой вы работаете. Абстрактный совет - попробуйте перехватить событие закрытия окна и написать к нему другую логику.
levaaveryanov: библиотеки tkinter keyboard time
KnowsUser1: Например, для встроенного фреймворка tkinter подобный перехват делается в одну строку (самый топорный если делать):
MainWindow.protocol('WM_DELETE_WINDOW", sys.exit)
где MainWindow - родительское окно (экземпляр tkinter.Tk)
levaaveryanov: спасибо!
KnowsUser1: подобный "перехват" просто убьёт процесс приложения при закрытии окна. Но, насколько помню, tkinter сам прекрасно справляется с подчисткой мусора за собой при закрытии
levaaveryanov: простите что задаю много вопросов, а можно как нибудь сделать так чтобы после того как открылся интерфейс заработал другой скрипт
KnowsUser1: Обратите внимание на модули Threading, Multiprocessing, а так же некоторые функции модулей os и sys.
levaaveryanov: почитал пару статей по этому поводу, ничего не понял
KnowsUser1: Значит, вам ещё рановато лезть в такие дебри.
KnowsUser1: Вообще, из всех перечисленных модулей, для запуска другого скрипта из выполняемого, нужен только threading, что бы отправить функцию, запускающую другой скрипт в параллельный поток, что бы она не мешала основному скрипту. Но учтите, что при таком подходе параллельно запущенные скрипты никак не смогут изменять состояния друг друга
Похожие вопросы
Предмет: Литература, автор: Аноним