Командная строка испортилась после запуска программы на Python

Код ниже создает макет и отображает некоторый текст в макете. Затем макет отображается на экране консоли с помощью необработанного модуля отображения из библиотеки Urwid. (Более подробную информацию о моем полном проекте можно получить из вопросов в разделах " Необходимые виджеты для отображения консольного приложения 1D" и " Использование Urwid для создания консольного приложения 2D".

Моя просьба о помощи скайпа здесь. Я могу запустить код для отображения соответствующей информации. При нажатии F8 код запрашивает диалоговое окно на экране, если выйти. При нажатии клавиши "y" приложение завершается. Но сразу после этого командная строка запуталась. Я не могу ничего написать в командной строке. Нажатие кнопки Enter только повторяет командную строку, как указано ниже:

[gehna@localhost urwidFormBrowser]$ [gehna@localhost urwidFormBrowser]$ [gehna@localhost 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. Как я могу исправить эту проблему?

2 ответа

Если есть ошибка / исключение, ваша программа должна отменить изменения в терминале, которые были сделаны во время инициализации curses. Если вы не хотите этого делать, предусмотрена функция-обертка. Пожалуйста, проверьте документацию.

В вашем случае вместо прямого вызова main вы можете звонить через обертку.

curses.wrapper(main)

Убедитесь, что используете sys.exit(retCode) по завершении вашего исполнения, и эта проблема не должна произойти

Другие вопросы по тегам