下面的代码创建布局并在布局中显示一些文本。接下来,使用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电话什么的。我该如何解决这个问题?
对于它的价值,就可以解决您的终端这个问题。无论如何,你可能想要修复你的代码。 :) –
谢谢,退出应用程序后输入“重置”给了我一个新的终端,但我希望我的代码干净地退出,就像它发生在许多其他urwid应用程序。 :-)回复 –
我已经能够重现你的问题,但我不是很熟悉_urwid_,基本上'提高urwid.ExitMainLoop()'应该恢复原始终端设置,包括回声,所以我很难过。 –