Function 使用回调函数传递其他参数

Function 使用回调函数传递其他参数,function,callback,urwid,Function,Callback,Urwid,以下示例(取自此处:)显示了如何将键值传递给回调函数show\u或\u exit import urwid def show_or_exit(key): if key in ('q', 'Q'): raise urwid.ExitMainLoop() txt.set_text(repr(key)) txt = urwid.Text(u"Hello World") fill = urwid.Filler(txt, 'top') loop = urwid.Main

以下示例(取自此处:)显示了如何将键值传递给回调函数
show\u或\u exit

import urwid

def show_or_exit(key):
    if key in ('q', 'Q'):
        raise urwid.ExitMainLoop()
    txt.set_text(repr(key))

txt = urwid.Text(u"Hello World")
fill = urwid.Filler(txt, 'top')
loop = urwid.MainLoop(fill, unhandled_input=show_or_exit)
loop.run()
我如何通过这个回调将另一个参数传递给
show_或_exit
,这个回调取决于系统的状态,类似这样的情况

...: param_val = 4
...:
...: def my_fun():
...:     #do something
...:     return param_val
...:
...: def show_or_exit(key, param_val):
...:     if key in ('q', 'Q'):
...:         raise urwid.ExitMainLoop()
...:     txt.set_text(repr(key))
...:     do_something(param_val)
...:
...: txt = urwid.Text(u"Hello World")
...: fill = urwid.Filler(txt, 'top')
...: loop = urwid.MainLoop(fill, unhandled_input=show_or_exit)
...: loop.run()

因此,有几种方法可以做到这一点。你可以使用全局变量,但我想你问这个问题可能是因为你想要一个更好的方法(另外,全局变量在改变状态时会很笨拙)

对于本例中的小型程序,一种技术可以是使用一个全局对象存储状态:

import urwid
from functools import partial


class State(object):
    param1 = 1
    param2 = 'ola'

    def __repr__(self):
        return 'State(param1={}, param2={})'.format(self.param1, self.param2)


def show_or_exit(app_state, key):
    if key in ('q', 'Q'):
        raise urwid.ExitMainLoop()
    app_state.param1 += 1
    txt.set_text('key: {!r} state: {!r}'.format(key, app_state))


txt = urwid.Text(u"Hello World")
fill = urwid.Filler(txt, 'top')
app_state = State()
callback = partial(show_or_exit, app_state)
loop = urwid.MainLoop(fill, unhandled_input=callback)
loop.run()
为了便于说明,我尽量少用这个示例,但是State类将从中受益匪浅。强烈推荐!:)


对于更复杂的程序,我建议构建支持回调事件的自定义小部件,并单独管理状态:您可以看到。

我最终对box小部件(
Frame
)进行了子类化,添加了不受使用回调时遇到的范围问题约束的属性;这与您的解决方案没有太大区别。谢谢还有一个问题:我发现Urwid使用起来有点混乱。你会说它通常遵循良好的编码实践,还是在某种程度上有点不寻常?@令人困惑的是,第三,我会说它设计得很好,是的。小部件的工作方式有一些不明显的地方,据我所知,这是“为终端编写小部件”方法所固有的。我已经写了一些,我计划很快写更多关于它的内容。这个图书馆还有很多潜力有待开发。我鼓励你继续挖掘!=)顺便说一句,我很想知道你发现哪些东西让人困惑,这将是非常有趣的!也许你可以提出更多的问题?:)