Python Curses,从屏幕读取宽字符的属性

问题描述

我试图解决的问题是获得一对 ch,att 代表当前显示在某个给定位置的字符和相关属性

现在,当显示的字符不是宽字符(即 ASCII 字符)时,方法 .inch 会完成工作以正确屏蔽结果。当显示的字符很宽时就会出现问题。更准确地说,我知道如何通过 .instr 获取给定的字符,但是此函数不返回有关该属性的任何信息。

由于,据我所知,没有单独获取属性的特定函数,我的第一次尝试是使用 .inch,去掉 8 个较低的有效位并将结果解释为属性。这似乎在某种程度上有效,但仔细检查我意识到以这种方式阅读没有属性的希腊字母(例如u"u\03b1")会返回att = 11.0000.0000而不是0。有没有更好的方法解决这个问题?

编辑,python3 的最小示例

import curses

def bin(x):
    out = ''
    while x > 0:
        out = str(x % 2) + out
        x = x // 2

    return out

def main(s):
    s.addstr(1,1,u'\u03b1')
    s.refresh()

    chratt = s.inch(1,1)

    att = chratt & 0xFF00

    s.addstr(2,bin(att))
    s.refresh()

    while True:
        pass

curses.wrapper(main)

解决方法

在curses 中,inch 和instr 仅适用于您怀疑的ascii 字符。正如一位 ncurses 创建者所解释的那样,像 utf-8 中的字符这样的“复杂”或“宽”字符有另一个系统。

然而,坏消息。它们还没有在 python 诅咒中实现。已提交拉取请求 here on stackoverflow 并且它非常接近合并 (90%),所以如果您真的需要它,那么为什么不自己去贡献呢?

如果这不是一个选项,那么您可以尝试将您对屏幕所做的每个更改存储在一个变量中,然后从那里提取宽字符。