0

Код ниже создает макет и отображает текст в макете. Затем макет отображается на экране консоли с использованием модуля необработанного отображения из библиотеки Urwid. (Более подробную информацию о моем полном проекте можно почерпнуть из вопросов на Required widgets for displaying a 1D console application и Using Urwid to create a 2D console application.Командная строка, запутанная после запуска программы Python

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

[[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

Для чего это стоит, вы можете исправить ваш терминал, введя 'reset'. Скорее всего, вы захотите исправить свой код. :) –

+0

Спасибо, набрав 'reset' после выхода из приложения, дает мне свежий терминал, но я бы хотел, чтобы мой код вышел чисто, как это происходит со многими другими приложениями urwid. :-) для ответа –

+0

Я смог воспроизвести вашу проблему, но я не очень хорошо знаком с _urwid_ и в основном 'raise urwid.ExitMainLoop()' должен восстановить исходные настройки терминала, включая эхо, поэтому я в тупике. –

ответ

1

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

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

curses.wrapper(main) 
0

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

Смежные вопросы