2013-07-28 58 views
0

下面的代码创建布局并在布局中显示一些文本。接下来,使用Urwid库中的原始显示模块在控制台屏幕上显示布局。 (在我的整个项目的更多信息可以从问题在Required widgets for displaying a 1D console application中收集Using Urwid to create a 2D console application运行Python程序后出现命令提示符

我的Skype帮助请求是here。我可以运行代码以显示相关信息。一旦按下F8代码在屏幕上显示一个对话框,如果退出,按'y'键,应用程序结束,但在此之后,命令提示符被搞砸了,我不能在命令提示符下写任何东西。按输入按钮只重复命令提示符如下:

[[email protected] urwidFormBrowser]$ [[email protected] urwidFormBrowser]$ [[email protected] urwidFormBrowser]$ 

的代码是:

#!/usr/bin/env python 

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 = urwid.raw_display.Screen() 
     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.exit_view = formLayoutExit() 
     self.loop = urwid.MainLoop(self.view, self.palette, unhandled_input=self.unhandled_input) 
     self.loop.widget = self.view 
     self.loop.run() 

    def unhandled_input(self, key): 
     if key == 'f8': 
      self.loop.widget = self.exit_view 
      return True 
     if self.loop.widget != self.exit_view: 
      return 
     if key in ('y', 'Y'): 
      raise urwid.ExitMainLoop() 
     if key in ('n', 'N'): 
      self.loop.widget = self.view 
      return True 

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 frame 


def formLayoutExit(): 
    exit = urwid.BigText(('exit'," Quit? "), urwid.font.HalfBlock5x4Font()) 
    exit = urwid.Overlay(exit, formLayout(), 'center', None, 'middle', None) 
    return exit 

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(): 
    #global ui 
    form = FormDisplay() 
    form.main() 

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

我怀疑应用程序退出后显示的行为已经得到了做的功能FormDisplay,和的FormLayout回报formlayoutExit电话什么的。我该如何解决这个问题?

+0

对于它的价值,就可以解决您的终端这个问题。无论如何,你可能想要修复你的代码。 :) –

+0

谢谢,退出应用程序后输入“重置”给了我一个新的终端,但我希望我的代码干净地退出,就像它发生在许多其他urwid应用程序。 :-)回复 –

+0

我已经能够重现你的问题,但我不是很熟悉_urwid_,基本上'提高urwid.ExitMainLoop()'应该恢复原始终端设置,包括回声,所以我很难过。 –

回答

1

如果出现错误/异常,您的程序应该撤销在curses初始化期间完成的终端更改。如果你不想这样做,那就提供了一个包装函数。请检查文档。

在你的情况,而不是直接调用main,你可以通过包装调用。

curses.wrapper(main) 
0

确保在你执行完毕使用sys.exit(retCode),而不应通过输入`reset`发生

相关问题