'AttributeError' ao tentar criar uma tela de console usando o urwid

O código abaixo cria um layout e exibe algum texto no layout. Em seguida, o layout é exibido na tela do console usando o módulo de exibição bruto da biblioteca urwid. (Mais informações sobre o meu projeto completo podem ser obtidas de perguntas emconselhos de widget para um projeto de console eurwid para um projeto de console. Meu pedido de ajuda do Skype éAqui.) No entanto, a execução do código falha quando um AttributeError é gerado conforme descrito abaixo. Ao olhar para o código-fonte para urwid em /usr/lib64/python2.7/site-packages/urwid, vejo que main_loop.py e curses_display.py possuem uma função draw_screen com argumentos diferentes: main_loop.py -> def draw_screen (self ):

curses_display.py> def draw_screen (self, (colunas, linhas), r):

Eu tenho que especificar qual deles usar por algo comoimport draw_screen de specificFile comando? Ou há algo fundamentalmente errado? Estou olhando para o conceito de tela? Eu também posso ver que a classe de frame (Quadro de classe (BoxWidget): ) no arquivo /usr/lib64/python2.7/site-packages/urwid/container.py tem uma função de renderização (Def Render (auto, tamanho, foco = Falso):)

Erro ao executar o código:
Traceback (most recent call last):<br>File "./yamlUrwidUIPhase6.py", line 104, in <module><br>main() File "./yamlUrwidUIPhase6.py", line 98, in main<br>form.main()<br>File "./yamlUrwidUIPhase6.py", line 51, in main<br>self.loop.run()<br>File "/usr/lib64/python2.7/site-packages/urwid/main_loop.py", line 274, in run<br>self.screen.run_wrapper(self._run)<br>File "/usr/lib64/python2.7/site-packages/urwid/raw_display.py", line 237, in run_wrapper return fn()<br>File "/usr/lib64/python2.7/site-packages/urwid/main_loop.py", line 285, in _run self.draw_screen()<br>File "/usr/lib64/python2.7/site-packages/urwid/main_loop.py", line 508, in draw_screen<br>canvas = self._topmost_widget.render(self.screen_size, focus=True)<br>AttributeError: 'NoneType' object has no attribute 'render'

O código :

import sys  
sys.path.append('./lib')  
import os  
from pprint import pprint  
import random  
import urwid  
ui=urwid.raw_display.Screen()


class FormDisplay(object):

    def __init__(self):
        global ui
        self.ui = ui
        self.palette = self.ui.register_palette([
            ('Field', 'dark green, bold', 'black'), # information fields, Search: etc.
            ('Info', 'dark green', 'black'), # information in fields
            ('Bg', 'black', 'black'), # screen background
            ('InfoFooterText', 'white', 'dark blue'), # footer text
            ('InfoFooterHotkey', 'dark cyan, bold', 'dark blue'), # hotkeys in footer text
            ('InfoFooter', 'black', 'dark blue'),  # footer background
            ('InfoHeaderText', 'white, bold', 'dark blue'), # header text
            ('InfoHeader', 'black', 'dark blue'), # header background
            ('BigText', RandomColor(), 'black'), # main menu banner text
            ('GeneralInfo', 'brown', 'black'), # main menu text
            ('LastModifiedField', 'dark cyan, bold', 'black'), # Last modified:
            ('LastModifiedDate', 'dark cyan', 'black'), # info in Last modified:
            ('PopupMessageText', 'black', 'dark cyan'), # popup message text
            ('PopupMessageBg', 'black', 'dark cyan'), # popup message background
            ('SearchBoxHeaderText', 'light gray, bold', 'dark cyan'), # field names in the search box
            ('SearchBoxHeaderBg', 'black', 'dark cyan'), # field name background in the search box
            ('OnFocusBg', 'white', 'dark magenta') # background when a widget is focused
           ])
        urwid.set_encoding('utf8')

    def main(self):
        global ui
        #self.view = ui.run_wrapper(formLayout)
        self.ui.start()
        self.view = formLayout()

        self.loop = urwid.MainLoop(self.view, self.palette, unhandled_input=self.unhandled_input)
        self.loop.run()

    def unhandled_input(self, key):
        if key == 'f8':
          quit()
          return


def formLayout():
    global ui
    text1 = urwid.Text("Urwid 3DS Application program - F8 exits.")
    text2 = urwid.Text("One mission accomplished")

    textH = urwid.Text("topmost Pile text")
    cols = urwid.Columns([text1,text2])
    pile = urwid.Pile([textH,cols])
    fill = urwid.Filler(pile)

    textT  = urwid.Text("Display") 

    textSH = urwid.Text("Pile text in Frame")
    textF = urwid.Text("Good progress !")

    frame = urwid.Frame(fill,header=urwid.Pile([textT,textSH]),footer=textF)
    dim = ui.get_cols_rows()
    #ui is treated as global handle for all functions, either belonging
    #to any class or standalone functions such as formLayout
    #need to check if screen has been started
    if not ui._started:
        print("Screen has not been started, so no use of rendering.Thus return :-( ")
        return

    ui.draw_screen(dim, frame.render(dim, True))
    return

def RandomColor():
    '''Pick a random color for the main menu text'''
    listOfColors = ['dark red', 'dark green', 'brown', 'dark blue',
                    'dark magenta', 'dark cyan', 'light gray',
                    'dark gray', 'light red', 'light green', 'yellow',
                    'light blue', 'light magenta', 'light cyan', 'default']
    color = listOfColors[random.randint(0, 14)]
    return color

def main():
    form = FormDisplay()
    form.main()

########################################
##### MAIN ENTRY POINT
########################################
if __name__ == '__main__':
    main()

Eu não quero mudar a função formLayout como eu pretendo adicionar mais a esta estrutura de código básico, onde em outra função será adicionada que chama repetidamente formLayout para manter a atualização da tela com base na leitura de valores de um arquivo yml. Eu já tenho um código separado que lida com a leitura do arquivo yaml e a extração de dicionários ordenados. Depois de descobrir como fazer com que o console básico do urwid funcione, posso passar a integrar os dois para criar o aplicativo final.

questionAnswers(1)

yourAnswerToTheQuestion