-1

我是使用 Urwid 库(内置 Python)的新手,我试图在 urwid 示例中了解一些现有的 urwid示例。其中之一是这段代码:

import urwid

palette = [
('banner', 'black', 'light gray', 'standout,underline'),
('streak', 'black', 'dark red', 'standout'),
('bg', 'black', 'dark blue'),]

txt = urwid.Text(('banner', u" Hello World "), align='center')
map1 = urwid.AttrMap(txt, 'streak')
fill = urwid.Filler(map1)
map2 = urwid.AttrMap(fill, 'bg')

def exit_on_q(input):
    if input in ('q', 'Q'):
    raise urwid.ExitMainLoop()

loop = urwid.MainLoop(map2, palette, unhandled_input=exit_on_q)
loop.run()
  1. 这个例子中的属性是如何工作的?
  2. 前景和背景是什么意思?
  3. map1 "wraps" txt 是什么意思?这是否意味着您创建了一个名为 map1 的小部件并将该小部件放置在放置 txt 的屏幕位置上?短语“用另一个小部件 B 包装一个小部件 A”是否与我们所说的“将小部件 A 映射到小部件 B”的意思相同?
  4. map1 是 Filler 装饰小部件的 original_widget 吗?
  5. 哪个代码部分匹配 streak 的垂直高度与 txt 的垂直高度完全匹配?为什么 streak 的垂直高度没有变得大于或小于 txt 的垂直高度?如果没有 map2 那么这是否意味着除了 txt1 屏幕的其余部分将是红色或只是黑色?
4

1 回答 1

1

属性是面向对象编程(OOP)的编程风格或范式的一部分。面向对象的程序由类和这些类的实例构成。类就像蓝图,实例就像由这些蓝图制成的东西。

例如,您可能有一个名为 Person 的类,然后编写如下代码:

alice = Person(eye_colour="blue",hair_colour="ginger")
bob = Person(eye_colour="brown",hair_colour="black")

然后变量 eye_colour 和 hair_colour 将是 alice 和 bob 的属性。然后你可以这样做:

print(alice.eye_colour)
bob.hair_colour = "pink"
print(bob.hair_colour)

这将输出以下内容: blue pink

在 urwid 的情况下,诸如 Text 对象的实例之类的事物具有属性,在这种情况下,诸如要显示的文本以及如何对齐它们之类的事物。例如这里 -txt = urwid.Text(('banner', u" Hello World "), align='center')创建一个 Text 类的实例,并将其分配给txt具有显示属性的变量('banner', u" Hello World")和另一个align具有值“中心”的属性 ( )。这意味着程序将在显示对象时以横幅样式显示 unicode 字符串“Hello World”,并与中心对齐。

在回答您的一些问题时:

map1 包裹 txt 意味着 map1 具有 txt 作为属性,因此程序以基于 map1 其他属性的样式显示 txt,在本例中为“streak”。与高度匹配的代码位于模块 urwid 中的某处,它通过 . 行添加到您的程序中import urwid。如果没有 map2 那么我认为,正如这里所说那么背景颜色将是您的默认终端颜色。

于 2013-07-29T12:49:02.017 回答