如何改变在python指针的位置?

我想在程序正在实时获取它们时画出一些特殊的单词。 所以我写了这段代码很好,但我仍然有问题用键盘上的移动键改变指针的位置,并开始从我移动它的位置打字。 谁能给我一个提示如何做到这一点? 这里是代码:

from colorama import init from colorama import Fore import sys import msvcrt special_words = ['test' , 'foo' , 'bar', 'Ham'] my_text = '' init( autoreset = True) while True: c = msvcrt.getch() if ord(c) == ord('\r'): # newline, stop break elif ord(c) == ord('\b') : sys.stdout.write('\b') sys.stdout.write(' ') my_text = my_text[:-1] #CURSOR_UP_ONE = '\x1b[1A' #ERASE_LINE = '\x1b[2K' #print ERASE_LINE, elif ord(c) == 224 : set (-1, 1) else: my_text += c sys.stdout.write("\r") # move to the line beginning for j, word in enumerate(my_text.split()): if word in special_words: sys.stdout.write(Fore.GREEN+ word) else: sys.stdout.write(Fore.RESET + word) if j != len(my_text.split())-1: sys.stdout.write(' ') else: for i in range(0, len(my_text) - my_text.rfind(word) - len(word)): sys.stdout.write(' ') sys.stdout.flush() 

做这个简单的方法

由于您似乎正在使用colorama模块,因此定位光标最简单便捷的方法是使用相应的ANSI控制序列(请参阅http://en.m.wikipedia.org/wiki/ANSI_escape_code

您正在寻找的应该是CUP – 光标位置(CSI n; m H),将光标定位在第n行和第m列。

代码将如下所示:

 def move (y, x): print("\033[%d;%dH" % (y, x)) 

用手做任何事情都是痛苦的

即使在Windows控制台中使事情工作的漫长而痛苦的方式,不知道上述控制顺序将是使用Windows API。

幸运的是,只要不忘记对colorama.init()的调用, 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版本。

要检测是否支持curses,或者你将不得不使用Windows API,你可以尝试这样的事情。

 #==== IMPORTS ================================================================= try: import curses HAVE_CURSES = True except: HAVE_CURSES = False pass