Как вывести sh текст, напечатанный в текущей строке в командной строке? (Python 3,8 на Windows) - PullRequest
0 голосов
/ 08 апреля 2020

Принимая во внимание следующую программу:

from time import sleep
from threading import Thread


def speaker():
    while True:
        sleep(3)
        print("[*]I'm speaking........")


if __name__ == "__main__":
    my_speaker = Thread(target=speaker)
    my_speaker.start()
    while True:
        msg = input("[Your message]>> ")
        print("Your message: " + msg)

Вывод, если я ничего не ввожу во ввод ('_' - позиция курсора):

[Your message]>> [*]I'm speaking........
[*]I'm speaking........
[*]I'm speaking........
[*]I'm speaking........
[*]I'm speaking........
[*]I'm speaking........
[*]I'm speaking........
_

Вывод, который я хотел бы показать:

[*]I'm speaking........
[*]I'm speaking........
[*]I'm speaking........
[*]I'm speaking........
[*]I'm speaking........
[*]I'm speaking........
[*]I'm speaking........
[Your message]>> _

Когда функция «динамик» выполняет функцию печати, он должен выполнить следующие шаги:

  • Переместить текст текущая строка до следующей строки

  • Возврат к началу предыдущей строки

  • Выполнить печать

  • Возврат к концу следующей строки

Я посмотрел здесь: https://docs.microsoft.com/en-us/windows/console/console-virtual-terminal-sequences и нашел несколько полезных вещей, таких как возможность go вернуться к началу текущей строки с помощью ' \ r ', однако я не хочу перезаписывать текст, а перемещаю его на следующую строку.

Какую идею?

Ответы [ 2 ]

0 голосов
/ 08 апреля 2020

Попробуйте это:

from time import sleep
from threading import Thread


def speaker():
    while True:
        sleep(3)
        print("\r[*]I'm speaking........\n[Your message]>> ", end="")


if __name__ == "__main__":
    my_speaker = Thread(target=speaker)
    my_speaker.start()
    while True:
        msg = input("[Your message]>> ")
        print("Your message: " + msg)
0 голосов
/ 08 апреля 2020

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

Следующая проблема заключается в том, что если вы сделайте так, ваш вклад будет в конце, но он также покажет вам что-то вроде "[Ваше сообщение] >> [*] Я говорю ........". Я думаю, это потому, что вы выполняете ввод и l oop почти одновременно, и это как бы «сводит с ума», поэтому я добавил этот простой триггер opt, чтобы предотвратить работу печати и, наконец, получить ввод для нижняя часть без какого-либо странного исхода.

Это простое и грубое решение вашей проблемы.

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

from time import sleep
from threading import Thread



def speaker():
    while True:
        if opt is not None:
            print ("[*]I'm speaking........")
global opt                   
opt = 1

if __name__ == "__main__":
    my_speaker = Thread(target=speaker)
    my_speaker.start()
    while True:
        sleep(3)
        opt = None
        msg = input("[Your message]>> ")
        print("Your message: " + msg)
...