我想用一个基于ext的TUserI接口(TUI)编写一个程序,它由几种形式组成。在
这是我的尝试,它使用库npyscreen,但没有返回到第一个表单。代码也不包含更改列表项的逻辑。在
#! /usr/bin/env python3
# coding:utf8
import npyscreen
# content
headers = ["column 1", "column 2", "column 3", "column 4"]
entries = [["a1", "a2", "a3", "a4"],
["b1", "b2", "b3", "b4"],
["c1", "c2", "c3", "c4"],
["d1", "d2", "d3", "d4"],
["e1", "e2", "e3", "e4"]]
# returns a string in which the segments are padded with spaces.
def format_entry(entry):
return "{:10} | {:10} | {:10} | {:10}".format(entry[0], entry[1] , entry[2], entry[3])
class SecondForm(npyscreen.Form):
def on_ok(self):
self.parentApp.switchFormPrevious()
# add the widgets of the second form
def create(self):
self.col1 = self.add(npyscreen.TitleText, name="column 1:")
self.col2 = self.add(npyscreen.TitleText, name="column 2:")
self.col3 = self.add(npyscreen.TitleText, name="column 3:")
self.col4 = self.add(npyscreen.TitleText, name="column 4:")
class MainForm(npyscreen.Form):
def on_ok(self):
self.parentApp.switchForm(None)
def changeToSecondForm(self):
self.parentApp.change_form("SECOND")
# add the widgets of the main form
def create(self):
self.add(npyscreen.FixedText, value=format_entry(headers), editable=False, name="header")
for i, entry in enumerate(entries):
self.add(npyscreen.ButtonPress, when_pressed_function=self.changeToSecondForm, name=format_entry(entry))
class TestTUI(npyscreen.NPSAppManaged):
def onStart(self):
self.addForm("MAIN", MainForm)
self.addForm("SECOND", SecondForm, name="Edit row")
def onCleanExit(self):
npyscreen.notify_wait("Goodbye!")
def change_form(self, name):
self.switchForm(name)
if __name__ == "__main__":
tui = TestTUI()
tui.run()
我发现自己在用Npyscreen,所以我找到了你的问题。如果您仍在处理此应用程序,下面是您的初始代码,但这次将返回主窗体:
下面是我对这个问题的看法,它可以描述为控制台的master-detail user interface的实现。在
它使用urwid library,构建一些custom widgets来实现所描述的UI,它有两种模式:主视图(其中主小部件是一堆记录)和详细视图(一个覆盖的对话框,主视图在后面)。在
有很多事情可以改进,包括让它看起来更漂亮。:)
代码如下:
App
类保存应用程序的状态,跟踪主要的小部件,并包含在用户操作时调用的方法,如点击save/cancel按钮。在记录在SelectableRow小部件的方法
update_contents
中就地更新,该方法表示主列表中显示的记录。在CancelableEdit
小部件的存在只是为了能够从对话框窗口对esc作出反应。在请随意提出任何进一步澄清的问题,我试图使用合适的名称,并保持代码或多或少的可读性,但我知道这里也有很多事情要做,我不确定需要详细解释什么。在
这是一个有趣的练习,谢谢你给我这个借口!=)
相关问题 更多 >
编程相关推荐