首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >urwid不更新loop.draw_screen()上的屏幕

urwid不更新loop.draw_screen()上的屏幕
EN

Stack Overflow用户
提问于 2012-08-21 04:14:50
回答 2查看 3.1K关注 0票数 3

奇怪的是,当我运行程序时,它只更新屏幕20次中的1次…如果我按任何键,它也不会更新。如果以python code.py 2>log方式运行,则不会出现错误。在我用于内部日志记录的mylog.log中-它显示refresh()工作正常...

代码语言:javascript
复制
import urwid
from random import randint
import thread,logging
from time import sleep
logging.basicConfig(format = u'%(levelname)-8s [%(asctime)s] %(message)s', level = logging.CRITICAL, filename = u'mylog.log')

class ArRow (urwid.WidgetWrap):
    def __init__ (self):
        self.build_row()
        w = urwid.Columns(self.item)
        self.__super.__init__(w)
    def build_row(self):
        w=5
        self.item = [
            ('fixed',w,urwid.AttrWrap(urwid.Text(str(randint(1,100))), 'body', 'focus')),
            ('fixed',w,urwid.AttrWrap(urwid.Text(str(randint(1,100))), 'body', 'focus')),
            ('fixed',w,urwid.AttrWrap(urwid.Text(str(randint(1,100))), 'body', 'focus')),
        ]
    def refresh(self):
        self.build_row()
        w = urwid.Columns(self.item)
        self.__super.__init__(w)
        logging.critical(str(self.item))
    def selectable (self):
        return True
    def keypress(self, size, key):
        return key

palette = [
    ('body','dark cyan', '', 'standout','#0f6',''),
    ('focus','dark red', '', 'standout','light red',''),
    ]

def keystroke (input):
    if input in ('q', 'Q'):
        raise urwid.ExitMainLoop()

items=[ArRow()]#,ArRow(),ArRow(),ArRow(),ArRow()]
listbox = urwid.ListBox(urwid.SimpleListWalker(items))
view = urwid.Frame(urwid.AttrWrap(listbox, 'body'))
loop = urwid.MainLoop(view, palette, unhandled_input=keystroke)
loop.screen.set_terminal_properties(colors=256)

def live_report(*a):
    while True:
        items[0].refresh()
        loop.draw_screen()
        sleep(2)

thread.start_new(live_report,(0,))
loop.run()
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-08-21 05:51:20

解决方案:

代码语言:javascript
复制
class ArRow (urwid.WidgetWrap):
    def __init__ (self):
        self.build_row()
        self._w = AColumns(self.item)
        self.__super.__init__(self._w)
    def build_row(self):
        w=5
        self.item = [
            ('fixed',w,urwid.AttrWrap(urwid.Text(str(randint(1,100))), 'body', 'focus')),
            ('fixed',w,urwid.AttrWrap(urwid.Text(str(randint(1,100))), 'body', 'focus')),
            ('fixed',w,urwid.AttrWrap(urwid.Text(str(randint(1,100))), 'body', 'focus')),
        ]
    def refresh(self):
        self.build_row()
        self._w = AColumns(self.item)
        #self.__super.__init__(w)
        logging.critical(str(self.item))
......

def refresh(_loop,_data):
    for item in items:
        item.refresh()
    #loop.draw_screen()
    _loop.set_alarm_in(2,refresh)

loop.set_alarm_in(2,refresh)
loop.run()
票数 1
EN

Stack Overflow用户

发布于 2014-05-15 07:34:46

你为什么不干脆

代码语言:javascript
复制
import threading


def refreshScreen(mainloop):
    while 1:
        logging.debug("looping")
        mainloop.draw_screen()
        time.sleep(1)


mainloop = urwid.MainLoop(top, palette)
refresh = Thread(target=refreshScreen, args=(mainloop,))
refresh.start()
mainloop.run()
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12044463

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档