我正在查看一段源于urwid
的代码:
import urwid
from functools import partial
from random import randint
class State(object):
def __init__(self, main_widget):
self.main_widget = main_widget
def handle_keystroke(app_state, key):
if key in ('q', 'Q'):
raise urwid.ExitMainLoop()
else:
loop.widget = urwid.Filler(urwid.Button('new rand int:' + str(randint(0, 100))))
app_state = State(urwid.Filler(urwid.Button('original widget')))
callback = partial(handle_keystroke, app_state)
loop = urwid.MainLoop(app_state.main_widget, unhandled_input=callback)
loop.run()
并注意到loop
在函数unhandled_input
定义之前被引用。此外,它不是作为参数传递的,它只是按名称硬编码到函数中。1) 为什么这是可能的,以及:2)是否有更明确的替代方案?否则很难做到,因为存在loop
、app_state
和{
我不确定您的示例代码中有多少表示原始代码,但看起来您可能想熟悉一下the technique of using urwid's custom widgets wrapping text widgets, as shown in the answer的示例小部件,该小部件每次显示一行文本内容。在
下面是一个编写类似于您提供的示例代码的示例,其设计更适合urwid和Python:
也取决于您实际想要做什么,让定制小部件响应键盘事件是有意义的,而不是在全局处理程序中执行所有操作(IMO,对于简单程序来说,这完全可以)。在
当python编译一个函数时,作为赋值目标的左侧变量被视为}不是一个局部变量,它将在模块的名称空间中查找名称。在
local
,其余的都是全局变量。loop
没有赋值,因此当python运行loop.widget = urwid.Filler(...)
时,它知道{模块名称空间是动态的,因此只要
loop = urwid.MainLoop(app_state.main_widget, unhandled_input=callback)
在查找之前运行,loop
就会被创建并正常工作。由于在loop.run()
之前无法执行回调,因此将定义loop
。在这是独生子女和全球国家面临的典型风险之一。确保在使用资源之前创建资源并不总是容易的。在
相关问题 更多 >
编程相关推荐