做起来很简单
由于您似乎已经在使用colorama模块,定位光标的最简单和可移植的方法应该是使用相应的ANSI controlsequence(请参见:http://en.m.wikipedia.org/wiki/ANSI_escape_code)
您要查找的应该是CUP-Cursor Position(CSI n;m H),它将光标定位在行n和列m中
代码如下所示:def move (y, x):
print("\033[%d;%dH" % (y, x))
手忙脚乱
即使在windows控制台中,也不知道上面提到的控制序列,要想让事情正常工作,漫长而痛苦的方法就是使用windows API。
幸运的是,colorama模块将为您完成这项(艰苦的)工作,只要您不忘记对colorama.init()的调用。
出于说教的目的,我留下了最痛苦方法的代码,去掉了colorama模块的功能,手工完成所有事情。import ctypes
from ctypes import c_long, c_wchar_p, c_ulong, c_void_p
#==== GLOBAL VARIABLES ======================
gHandle = ctypes.windll.kernel32.GetStdHandle(c_long(-11))
def move (y, x):
"""Move cursor to position indicated by x and y."""
value = x + (y << 16)
ctypes.windll.kernel32.SetConsoleCursorPosition(gHandle, c_ulong(value))
def addstr (string):
"""Write string"""
ctypes.windll.kernel32.WriteConsoleW(gHandle, c_wchar_p(string), c_ulong(len(string)), c_void_p(), None)
正如在注释部分已经指出的,这个尝试仍然会给您留下问题,您的应用程序将只在命名控制台中工作,因此您可能仍然希望提供curses版本。
若要检测是否支持游标,或者必须使用windows API,可以尝试以下操作。#==== IMPORTS =================================================================
try:
import curses
HAVE_CURSES = True
except:
HAVE_CURSES = False
pass