Как что-то напечатать Каждый раз, когда что-то случается - PullRequest
0 голосов
/ 01 августа 2020

Я пытаюсь выучить python и во время обучения столкнулся с небольшой проблемой.

import time
import pyautogui

def SendScript():
    time.sleep(2)
    with open('script.txt') as f:
        lines = f.readlines()
    for line in lines:
        time.sleep(2)
        pyautogui.typewrite(line.strip())
        pyautogui.press('enter')
SendScript()

Я пытаюсь вывести что-то на экран каждый второй раз, когда ' Клавиша ввода была нажата, но я новичок, поэтому не знаю, как это сделать. Может ли кто-нибудь помочь мне выполнить sh эту задачу?

Ответы [ 4 ]

1 голос
/ 01 августа 2020

Как уже указывалось в другом ответе, простой переключатель может быть реализован с помощью bool, а затем кода, который переключает его каждый раз, когда что-то происходит:

thing = False
:
if happens(something):
    thing = not thing

Это нормально для переключения между двумя состояниями. Более общий подход, который позволяет использовать больше состояний, заключается в использовании переменной numeri c и оператора по модулю:

times = 0
maxtimes = 12
:
if happens(something):
    times += 1
    if times % maxtimes == 1:
        print("ding dong")

Вместо этого можно сравнить модуль по модулю с 0, если вы хотите печатать 12, 24 числа. et c итераций вместо первой, 13-й, et c или, конечно, любого другого смещения в течение периода, если это то, что вы хотите.

Еще один полезный трюк - переключение между нулем и какое-то другое значение.

value = 0
othervalue = 1234
:
if happens(something):
    value = othervalue - value

Конечно, вы можете переключаться между любыми двумя значениями; вычтите текущее значение из их суммы, чтобы получить другое.

Само собой разумеется, просто переключение или флип-флоп само по себе не очень полезно; вы, вероятно, также добавите некоторые (прямо или косвенно) видимые пользователю действия внутри блока if happens(something):.

1 голос
/ 01 августа 2020

Из более постепенного подхода вы могли бы сделать:

events=['event1', 'event2', 'event3', 'event4', 'event5', 'event6', 'event7', 'event8']

counter = 0
for event in events:
    counter += 1
    if counter % 2 == 0: # ie do stuff when divisible by 2, ie when its even
        print('print what you want to be printed every second time')
    else:
        pass

Конечно, вы не перебираете события в цикле, как я в этом примере. Дело в том, чтобы считать события и делать что-то только тогда, когда этот счетчик четный.

1 голос
/ 01 августа 2020

Вы можете создать новую логическую переменную, чтобы отслеживать, была ли ранее нажата клавиша ввода. Таким образом, каждый раз, когда for l oop повторяется, значение pressed переключается, и только когда значение pressed равно True, он что-то печатает.

import time
import pyautogui

def SendScript():
    pressed = False
    time.sleep(2)
    with open('script.txt') as f:
        lines = f.readlines()
    for line in lines:
        time.sleep(2)
        if pressed:
            print("Something")
        pressed = not pressed
        pyautogui.typewrite(line.strip())
        pyautogui.press('enter')
SendScript()
0 голосов
/ 01 августа 2020

Вы можете использовать для этого генератор:

def everySecondTime():
    while True:
        yield "hi"
        yield "not hi"

mygen = everySecondTime()
print(next(mygen))
print(next(mygen))
print(next(mygen))
print(next(mygen))

Это печатает

hi
not hi
hi
not hi

Я уверен, что вам ясно, как вы могли бы адаптировать это, чтобы вместо этого выполнять другие действия .

Вопрос о том, лучше ли этот подход, чем просто использование логического значения, является весьма спорным, но я решил оставить его здесь, чтобы вы могли узнать о генераторах (ключевое слово yield), если хотите.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...