用于输入用户输入和刷新控制台的Python程序,无需滚动"

时间:2016-03-21 22:59:33

标签: python

我们说我有这个小Python程序:

def drawLine():

    userInput = input("Coordinates:")
    userInput = userInput.split() # x y

    # Draw
    # ... some drawing algo which will print an "X" on the screen with x,y

drawLine()
drawLine()

现在注意drawLine()被调用两次,因此可以获取两个输入并绘制两个X-es。不幸的是,控制台会向上滚动。我想要我的python程序" 倾听"用户按键和" 不滚动"。想想一个迷你控制台Photoshop,它也不会将你的画布滚动到视线之外。

更新: 问题足够小,不能使用图书馆。

4 个答案:

答案 0 :(得分:1)

在这种情况下,您可能需要Curses库。

它允许您在给定坐标处显示字符串:https://docs.python.org/3.3/library/curses.html#curses.window.addstr

您也可以离开回音模式,这样您就可以根据需要处理键盘输入,而无需将其打印到控制台:https://docs.python.org/3.3/library/curses.html#curses.noecho

答案 1 :(得分:1)

我不确定我是否完全理解您的问题,但我认为可以通过清除控制台并重新绘制框架来实现。 How to clear the interpreter console?

答案 2 :(得分:1)

使用VT100控制代码:

.element {
    position: absolute;
    top: 50%;
    left: 50%;
    transform: translateX(-50%) translateY(-50%);
}

Windows必须有类似的东西。

答案 3 :(得分:1)

如果将输入保持在控制台下方是可以的,可以使用类将画布保存在数组中,只需在需要时进行渲染。

以下是一个例子:

#X-Drawer
class Canvas:
    def __init__(self, w, h):
        self.w = w
        self.h = h
        self.c = []
        for i in range(w * h):
            self.c.append(' ')
        print len(self.c)
    def render(self):
        u = 0
        s = ""
        for i in range(len(self.c)):
            s += self.c[i]
            if not i % self.w:
                s += "\n"
        print s
    def drawX(self, x, y):
        n = [(x, y), (x + 1, y + 1), (x + 2, y + 2), (x + 2, y), (x, y + 2)]
        for i in n:
            v = i[0] * self.w + i[1]
            if v < len(self.c):
                self.c[v] = 'X'
    def drawLine(self, x, d):
        n = []
        if d:
            n = [(x, y), (x + 1, y + 1), (x + 2, y + 2)]
        else:
            n = [(x, y), (x + 1, y + 1), (x + 2, y + 2)]
        for i in n:
            v = i[0] * self.w + i[1]
            if v < len(self.c):
                self.c[v] = 'X'

def clearScreen():
    for i in range(64):
        print

c = Canvas(25, 25)

while True:
    clearScreen()
    c.render()
    i = raw_input("Coordinates: ").split()
    c.drawX(int(i[0]), int(i[1]))

您也可以使用对clrHow to clear the interpreter console?)的操作系统调用替换clearScreen,而不是打印64行。

注意:我的示例使用drawX函数,您可以使用drawLine函数和不同的坐标绘制线条。