使用回调函数传递额外的参数
pass additional arguments with callback function
以下示例(取自此处:http://urwid.org/tutorial/index.html)显示了如何将键值传递给回调函数 show_or_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_or_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()
出于说明目的,我将此示例保持在最小状态,但是 class 州将从 using the attrs library 中获益良多。强烈推荐! :)
对于更复杂的程序,我建议构建支持回调事件的自定义小部件并单独管理状态:你可以看到an example of implementing that in this solitaire game。
以下示例(取自此处:http://urwid.org/tutorial/index.html)显示了如何将键值传递给回调函数 show_or_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_or_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()
出于说明目的,我将此示例保持在最小状态,但是 class 州将从 using the attrs library 中获益良多。强烈推荐! :)
对于更复杂的程序,我建议构建支持回调事件的自定义小部件并单独管理状态:你可以看到an example of implementing that in this solitaire game。