gpt4 book ai didi

Python:urwid:试图处理不同的 View

转载 作者:太空狗 更新时间:2023-10-30 03:03:30 27 4
gpt4 key购买 nike

我正在尝试编写一个具有不同 View 的程序。

我试图创建一个类来处理带有 urwid 的不同 View ,同时将 View 代码与其余部分分开。但经过多次不同的尝试,我不知道从哪里开始了。

我需要哪些 urwid 对象来彻底删除和重绘屏幕?以及如何封装它们以便我可以在用户输入后切换 View ?

最佳答案

来自Urwid documentation :

The topmost widget displayed by MainLoop must be passed as the first parameter to the constructor. If you want to change the topmost widget while running, you can assign a new widget to the MainLoop object’s MainLoop.widget attribute. This is useful for applications that have a number of different modes or views.

现在是一些代码:

import urwid

# This function handles input not handled by widgets.
# It's passed into the MainLoop constructor at the bottom.
def unhandled_input(key):
if key in ('q','Q'):
raise urwid.ExitMainLoop()
if key == 'enter':
try:

## This is the part you're probably asking about

loop.widget = next(views).build()
except StopIteration:
raise urwid.ExitMainLoop()

# A class that is used to create new views, which are
# two text widgets, piled, and made into a box widget with
# urwid filler
class MainView(object):
def __init__(self,title_text,body_text):
self.title_text = title_text
self.body_text = body_text

def build(self):
title = urwid.Text(self.title_text)
body = urwid.Text(self.body_text)
body = urwid.Pile([title,body])
fill = urwid.Filler(body)
return fill

# An iterator consisting of 3 instantiated MainView objects.
# When a user presses Enter, since that particular key sequence
# isn't handled by a widget, it gets passed into unhandled_input.
views = iter([ MainView(title_text='Page One',body_text='Lorem ipsum dolor sit amet...'),
MainView(title_text='Page Two',body_text='consectetur adipiscing elit.'),
MainView(title_text='Page Three',body_text='Etiam id hendrerit neque.')
])

initial_view = next(views).build()
loop = urwid.MainLoop(initial_view,unhandled_input=unhandled_input)
loop.run()

简而言之,我使用全局键处理函数来监听用户按下的特定序列,并在接收到该序列时,我的键处理函数使用 MainView 类构建一个新的 View 对象并替换 loop .widget 与那个对象。当然,在实际应用程序中,您会希望在 View 类中的特定小部件上创建信号处理程序,而不是对所有用户输入使用全局 unhandled_input 函数。您可以阅读有关 connect_signal 函数的信息 here .

请注意 Signal Functions 文档中有关垃圾回收的部分:如果您打算编写具有多个 View 的内容,即使您替换了它们,它们仍将保留在内存中,因为 signal_handler 是一个闭包,这隐式保留对该小部件的引用,因此您需要将 weak_args 命名参数传递给 urwid.connect_signal 函数,以告诉 Urwid 在未被积极使用时将其释放在事件循环中。

关于Python:urwid:试图处理不同的 View ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18705750/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com