【问题标题】:Urwid: how does the button widget callback work?Urwid:按钮小部件回调如何工作?
【发布时间】:2019-09-09 01:13:47
【问题描述】:

如果有人熟悉 urwid 库,我可以使用它。下面有两个代码 sn-ps,第一个是从 urwid 文档中复制的工作示例,第二个是我将文档中的一些不同示例合在一起的结果。

我的主要问题是应该在“点击”事件上运行的 item_chosen 函数,即按下回车,似乎没有在第二个版本中运行

除了文档之外,很难找到许多 urwid 资源,而且我使用它的时间还不够长,无法完全理解他们的小部件模型,如果这有点微不足道或显而易见,我深表歉意。

这是一个从 urwid 文档复制的工作示例。

import urwid

choices = u'Chapman Cleese Gilliam Idle Jones Palin'.split()

def menu(title, choices):
    body = [urwid.Text(title), urwid.Divider()]
    for c in choices:
        button = urwid.Button(c)
        urwid.connect_signal(button, 'click', item_chosen, c)
        body.append(urwid.AttrMap(button, None, focus_map='reversed'))
    return urwid.ListBox(urwid.SimpleFocusListWalker(body))

def item_chosen(button, choice):
    response = urwid.Text([u'You chose ', choice, u'\n'])
    done = urwid.Button(u'Ok')
    urwid.connect_signal(done, 'click', exit_program)
    main.original_widget = urwid.Filler(urwid.Pile([response,
        urwid.AttrMap(done, None, focus_map='reversed')]))

def exit_program(button):
    raise urwid.ExitMainLoop()

main = urwid.Padding(menu(u'Pythons', choices), left=2, right=2)
top = urwid.Overlay(main, urwid.SolidFill(u'\N{MEDIUM SHADE}'),
    align='center', width=('relative', 60),
    valign='middle', height=('relative', 60),
    min_width=20, min_height=9)
urwid.MainLoop(top, palette=[('reversed', 'standout', '')]).run()

我尝试将它重构为一个类,但成功率参差不齐。

class Menu:
    def __init__(self,title,choices):
        pad = urwid.Padding(self.make(title, choices), left=2, right=2)
        self.main = urwid.Overlay(pad, urwid.SolidFill(u'\N{MEDIUM SHADE}'),
            align='center', width=('relative', 60),
            valign='middle', height=('relative', 60),
            min_width=20, min_height=9)

    def make(self,title,choices):
        body = [urwid.Text(title), urwid.Divider()]
        for c in choices:
            button = urwid.Button(c)
            urwid.connect_signal(button, 'click', self.item_chosen, c)
            body.append(urwid.AttrMap(button, None, focus_map='reversed'))
        return urwid.ListBox(urwid.SimpleFocusListWalker(body))

    def item_chosen(self, button, choice):
        response = urwid.Text([u'You chose ', choice, u'\n'])
        done = urwid.Button(u'Ok')
        urwid.connect_signal(done, 'click', exit_program)
        self.main.original_widget = urwid.Filler(urwid.Pile([response,
            urwid.AttrMap(done, None, focus_map='reversed')]))

我的完整代码在这里:https://pastebin.com/bv4eubiy

如上所述,如果您运行第二个代码,您会注意到,显示您选择的对话框不会出现,我不知道为什么。

【问题讨论】:

    标签: python urwid


    【解决方案1】:

    在对文档进行了多次反思之后,我的错误很明显。

    self.main.original_widget = urwid.Filler(urwid.Pile([response,urwid.AttrMap(done, None, focus_map='reversed')]))

    正在修改urwid.Padding 类的original_widget 成员。在上面的代码中,我将self.main 设置为urwid.Overlay 而不是urwid.Padding。在一些物体周围移动可以解决问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-06-16
      • 2013-10-22
      • 2012-06-13
      • 2011-11-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多