Python - Curses - Addstr -multicolored字符串/理解函数

时间:2015-06-24 01:16:39

标签: python python-2.7 curses

我不知道用什么词来提问我的问题,所以请原谅下面的详细说明。我同样要求正确的单词/概念以及对特定问题的回答。

我试图在Python中使用curses将一个简单的控制台放在我的脚本前面。我希望控制台看起来比较熟悉,并且有3个命令的关键快捷键(加载,退出,继续)。要突出显示哪个键是动作的热键,我希望该字母的颜色不同。 (例如,E x ,热键为x)。我认为这必须由3" addstr"命令 - 写正常的第一个字母(" E"),然后用颜色属性写出x,然后"它"再次以正常颜色。

我认为这是因为我这样做了3次,而且在将来的屏幕中可能会更多,我应该为我做一个功能,看看它是否有效。但我无法弄清楚的是,如何在不将函数硬编码到变量名的情况下编辑屏幕。我希望能够在许多不同的窗口中调用该函数。我一开始认为我可以将屏幕变量传递给我的函数,但这看起来并不正确。

这是我开始研究的伪代码:

def keyString(menuString,fastChar,highlight,startX,startY,cScreen):
    #menuString is the word that has a letter to bring to attention
    #fastChar is the character that will be in a different colour
    #highlight is binary value to determine which colour pair to use
    #definition expects 'h' and 'n' to be colour pairs
    #startX and startY are the beginning cursor positions
    #cScreen would be global screen variable

    fCidx = menuString.find(fastChar) #index of the character to highlight
    fXadj = startX + fCidx #set the x position for character to highlight
    sHx = fXadj + 1 #set the x position for the remainder of the string
    fH = menuString[0:fCidx] #Slice the first half of the string
    sH = menuString[(fCidx+1):] #slice the remainder of the string

    if highlight:
            txtColor = h
    else:
            txtColor = n

    cScreen.addstr(startY,startX,fH,txtColor)
    cScreen.addstr(startY,fXadj,fastChar)
    cScreen.addstr(startY,sHx,sH,txtColor)

    return cScreen

请忽略糟糕的变量名称。我已经厌倦了打字并开始做短线。我意识到我并不需要担心明确说明x,y coords,因为光标位置会被记住。因此可以减少很多。我没有要求某人修改我的功能。我只是没有一个关于如何使用不同颜色为不同字符写出单词的函数的概念。我可能会坚持一个全球性的屏幕"在该功能中,仅用于编辑"屏幕",然后(例如)我将无法使用该功能用于" screen2"。

1 个答案:

答案 0 :(得分:0)

如果它有助于将来搜索,我发现我可以使用Windows(curses.newwin),这些可以被输入,并从函数返回。

例如,如果上面的代码位于名为" curse_tools.py"的文件中:

import curses
import curse_tools
def Main(screen):
    curses.init_pair(1,curses.COLOR_GREEN, curses.COLOR_BLACK)
    curses.init_pair(2,curses.COLOR_BLACK, curses.COLOR_GREEN)
    n = curses.color_pair(1)
    h = curses.color_pair(2)
    curse_tools.n = n
    curse_tools.h = h

    try:
            screen.border(0)
            box1 = curses.newwin(20, 20, 5, 5)
            box1.box()
            box1=curse_tools.keyString("Exit","x",False,1,1,box1)
            screen.refresh()
            box1.refresh()
            screen.getch()

    finally:
            curses.endwin()

curses.wrapper(Main)

此代码可以使用。我将重新编写我的原始代码,因为我在此过程中学到了很多东西,但也许未来的初学者会以某种方式遇到这个问题所以我想我会发布'解决方案' 。虽然我还不知道正确的词语。

这篇文章中的大多数代码来自Why won't my curses box draw?(如果它看起来很熟悉)