首页 > 解决方案 > Python Curses,从屏幕读取宽字符的属性

问题描述

我要解决的问题是得到一对chatt表示当前显示在某个给定位置的字符和相关属性。

现在,当显示的字符不是宽字符(即 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, 1, bin(att))
    s.refresh()

    while True:
        pass

curses.wrapper(main)

标签: pythonpython-curseswidechar

解决方案


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

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

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


推荐阅读