我是 urwid 在 Python 中的控制台小部件的新手,并正在尝试学习它。为了进行实验,我正在尝试制作一个屏幕,其中标题“Foobar”位于顶部,底部我将在左列中有 2 个图表(我相信这将被称为主体)。
到目前为止,我试过这个:
class SwitchingPadding(urwid.Padding):
def padding_values(self, size, focus):
maxcol = size[0]
width, ignore = self.original_widget.pack(size, focus=focus)
if maxcol > width:
self.align = "left"
else:
self.align = "right"
return urwid.Padding.padding_values(self, size, focus)
class Graphics():
palette = [
('body', 'black', 'light gray', 'standout'),
('header', 'white', 'dark red', 'bold'),
('button normal','light gray', 'dark blue', 'standout'),
('button select','white', 'dark green'),
('button disabled','dark gray','dark blue'),
('edit', 'light gray', 'dark blue'),
('title', 'white', 'black'),
('chars', 'light gray', 'black'),
('exit', 'white', 'dark cyan'),
('bg background','light gray', 'black'),
('bg 1', 'black', 'dark blue', 'standout'),
('bg 1 smooth', 'dark blue', 'black'),
('bg 2', 'black', 'dark cyan', 'standout'),
('bg 2 smooth', 'dark cyan', 'black'),
]
graph_num_bars = 2
graph_samples_per_bar = 10
def update_graph(self, force_update=False):
o = self.get_offset_now()
if o == self.last_offset and not force_update:
return False
self.last_offset = o
gspb = self.graph_samples_per_bar
r = gspb * self.graph_num_bars
d, max_value, repeat = self.controller.get_data( o, r )
l = []
for n in range(self.graph_num_bars):
value = sum(d[n*gspb:(n+1)*gspb])/gspb
# toggle between two bar types
if n & 1:
l.append([0,value])
else:
l.append([value,0])
self.graph.set_data(l,max_value)
def setup(self):
#Create Title for Frame widget
self.title = urwid.BigText("Foobar", "Thin6x6Font")
bt = SwitchingPadding(self.title, 'left', None)
bt = urwid.AttrWrap(bt, 'title')
bt = urwid.Filler(bt, 'bottom', None, 7)
bt = urwid.BoxAdapter(bt, 7)
def bar_graph(self):
satt = None
w = urwid.BarGraph(['bg background','bg 1','bg 2'], satt=satt)
return w
def main_window(self):
self.graph = self.bar_graph()
self.graph_wrap = urwid.WidgetWrap( self.graph )
vline = urwid.AttrWrap( urwid.SolidFill(u'\u2502'), 'line')
c = self.graph_controls()
w = urwid.Columns([('weight',2,self.graph_wrap),
('fixed',1,vline), c],
dividechars=1, focus_column=2)
w = urwid.Padding(w,('fixed left',1),('fixed right',0))
w = urwid.AttrWrap(w,'body')
w = urwid.LineBox(w)
w = urwid.AttrWrap(w,'line')
w = self.main_shadow(w)
return w
def main(self):
self.view = self.setup()
self.loop = urwid.MainLoop(self.view, self.palette)
self.loop.run()
def main():
Graphics().main()
if '__main__'==__name__:
main()
但我卡住了我得到的地方:
one@development ~/try $ python foo.py
Traceback (most recent call last):
File "foo.py", line 92, in <module>
main()
File "foo.py", line 89, in main
Graphics().main()
File "foo.py", line 85, in main
self.loop.run()
File "/usr/lib64/python2.7/site-packages/urwid/main_loop.py", line 272, in run
self.screen.run_wrapper(self._run)
File "/usr/lib64/python2.7/site-packages/urwid/raw_display.py", line 242, in run_wrapper
return fn()
File "/usr/lib64/python2.7/site-packages/urwid/main_loop.py", line 312, in _run
self.draw_screen()
File "/usr/lib64/python2.7/site-packages/urwid/main_loop.py", line 563, in draw_screen
canvas = self._topmost_widget.render(self.screen_size, focus=True)
AttributeError: 'NoneType' object has no attribute 'render'
one@development ~/try $
有谁知道为什么?