发出以正确格式打印到终端的内容(Python)

时间:2018-10-12 13:39:47

标签: python

我编写了一个非常简单的程序,该程序具有多个线程,应该将其输出到终端。一个线程打印出一个由10个星号组成的数组,另一个线程应该在后台运行,以等待检测到任何键盘按下情况。我无法解决的是,如果第二个线程正在运行,则终端中的输出无法正确打印出来。如果第二个线程停止了,则输出是所需的。

完整代码(根据要求):

#ASCII Frogger

from random import randint
import time
import sys, termios, tty, os
import threading    

def getch():
    fd = sys.stdin.fileno()
    old_settings = termios.tcgetattr(fd)
    try:
        tty.setraw(sys.stdin.fileno())
        ch = sys.stdin.read(1)

    finally:
        termios.tcsetattr(fd, termios.TCSADRAIN, old_settings)
    return ch

def resetPositions():
        pos = ["*", "*", "*", "*", "*", "*", "*", "*", "*", "*"]
        return pos


def threadKeyPressDetection():
    button_delay = 0.2

    while True:
            char = getch();

            if (char == "p"):
                #print("Stop!")
                exit(0)

def threadGame():

    positions = ["*", "*", "*", "*", "*", "*", "*", "*", "*", "*"]

    startingPos = randint(0, 9)

    frogPosition = startingPos

    i = 0
    ii = 0
    while i < 10:
        # if player press left go down in grid if space

        # if player press right go up in grid if space

        while ii < 10:
            if i < 5:
                positions[4] = (5 - i)
            print positions[ii],
            ii += 1
        ii = 0

        if i == 5:
            print "\n\n\n        GO        "

        print "\n"
        positions = resetPositions()

        if i > 5:
            positions[frogPosition] = '!'

        i += 1
        time.sleep(1)


try:
    t1 = threading.Thread(target=threadKeyPressDetection)
    t2 = threading.Thread(target=threadGame)

    t1.start()
    t2.start()

    t1.join()
    t2.join()

except:
    print("Error occured - unable to start thread")

所需的输出:

* * * * 3 * * * * *

* * * * 2 * * * * *

* * * * 1 * * * * *

        GO

* * * * * * * * * *

* * * * * * ! * * *

当前输出:

* * * * 5 * * * * *

            * * * * 4 * * * * *

                                        * * * * 3 * * * * *

                                                            * * * * 2 * * * * *

                                                                                * * * * 1 * * * * *

                                                                                                    * * * * * * * * * *


                                                                                                                                GO

2 个答案:

答案 0 :(得分:1)

问题发生在这里:

tty.setraw(sys.stdin.fileno())
  ch = sys.stdin.read(1)

将tty设置为原始模式,然后让其等待读取字符。当该线程等待输入时,另一个线程继续输出。它以tty原始模式继续输出。您可以通过将getchr()更改为just

来检查这是否是错误。
def getchr():
  tty.setraw(sys.stdin.fileno())
  exit(0)

这会将tty置于原始模式,然后立即终止线程。使用此方法,即使只有1个线程正在运行,您仍将获得相同的不需要的输出。

最简单的解决方法是使用here中的方法。

答案 1 :(得分:-1)

需要将tty.setraw更改为tty.setcbreak