python怎么换特定位置_如何在python中更改指针的位置?

I want to paint some special words while the program is getting them , actually in real-time .

so I've wrote this piece of code which do it quite good but i still have problem with changing the location of the pointer with move keys on keyboard and start typing from where i moved it .

can anyone give me a hint how to do it ?

here is the CODE :

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()

解决方案

Doing it the easy way

As you already seem to be using the colorama module, the most easy and portable way to position the cursor should be to use the corresponding ANSI controlsequence (see: http://en.m.wikipedia.org/wiki/ANSI_escape_code)

The one you are looking for should be CUP – Cursor Position (CSI n ; m H)positioning the cursor in row n and column m.

The code would look like this then:

def move (y, x):

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

Suffering by doing everything by hand

The long and painful way to make things work even in a windows console, that doesn't know about the above mentioned control sequence would be to use the windows API.

Fortunately the colorama module will do this (hard) work for you, as long as you don't forget a call to colorama.init().

For didactic purposes, I left the code of the most painful approach leaving out the functionality of the colorama module, doing everything by hand.

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)

As already stated in the comment section this attempt still leaves you with the problem, that your application will only work in the named console, so maybe you will still want to supply a curses version too.

To detect if curses is supported or you will have to use the windows API, you might try something like this.

#==== IMPORTS =================================================================

try:

import curses

HAVE_CURSES = True

except:

HAVE_CURSES = False

pass

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值