2015-11-14 12 views
0

Я пишу ncurses GUI для приложения. У меня следующий код в файл admin.py:Python: ncurses не печатает значение, переданное функции

#-*- coding: utf-8 -*- 

import curses.textpad 

from gui_helpers import * 
import global_vars as g 

def parse_command(win, command): 
    # print_str(win, 0, 0, command) 
    if command == "help": 
     print_str(win, 1, 1, "Available commands: add - adds a board, list - lists boards, mkdir - makes board directory") 

def display_admin_screen(win, keypress): 
    rows = win.getmaxyx()[0] 
    cols = win.getmaxyx()[1] 

    print_str_center(win, 0, 1, "Admin interface", g.RED|g.BOLD) 
    print_str(win, 1, 0, "Command line") 

    textpad_win = win.subwin(1, cols - 1, 3, 1) 
    output_win = win.subwin(5, cols - 1, 5, 1) 

    output_win.refresh() 
    textpad_win.refresh() 
    win.refresh() 

    curses.curs_set(1) 
    textpad = curses.textpad.Textbox(textpad_win) 
    textpad.stripspaces = 0 
    textpad_win.move(0,0) 
    textpad.edit() 

    command = textpad.gather() 
    parse_command(output_win, command) 
    # print_str(output_win, 0, 0, command) 
    textpad_win.clear() 
    curses.curs_set(0) 

Сама (функция display_admin_screen()) код выполняется в цикле в файле gui.py, который имеет все необходимые импорта библиотеки:

while True:  
     keypress = stdscr.getch() 
     display_title_bar(stdscr) 

     if g.STATE == 'motd': 
      display_motd(working_win, keypress) 
     elif g.STATE == 'boards': 
      boards_view.display_threads(working_win, g.SELECTED_BOARD, keypress) 
     elif g.STATE == 'admin': 
      admin.display_admin_screen(working_win, keypress) 

     working_win.refresh() 
     stdscr.refresh() 

У меня проблема m имеет то, что когда я набираю 'help' в текстовом поле в admin.py, ничего не происходит. Он должен отображать текст справки в output_win. Я проверил, что значение правильно передается функции parse_command() и что это правильное значение. Я думал, что это может быть проблема с созданием подокнов внутри цикла, поэтому я попытался создать их в gui.py вне цикла и передать их функции, но безрезультатно. Если я просто скажу функции parse_command(), чтобы написать что-то в окне вывода, это не создает никаких проблем. По какой-то причине блок if кажется проблемой.

ответ

0

Я наконец выяснил, что случилось. После нажатия клавиши «Ввод» добавлена ​​пустая строка (не новая строка \n), добавленная к команде. Все, что я должен был сделать изменения:

command = textpad.gather() 

в

command = textpad.gather().strip() 

И он работает сейчас.

0

Проблема заключается в том, что ваша программа читает из стандартного экрана с помощью

stdscr.getch() 

который делает обновление на stdscr, который может перезаписать любой из других окон (например, output_win). Чтобы обойти это, необходимо позвонить по номеру .getch(), используя окно, которое вы предпочитаете. обновлен.

Если вам неловко это сделать, вы можете использовать .touchwin() и wrefresh(), чтобы заставить данное окно перерисовать.

+0

Боюсь, что это не так. Я пробовал комментировать «stdscr.getch()» полностью, перемещая его вокруг цикла и даже комментируя «stdscr.refresh()», но ничего не помогло. Команда 'if command ==" help ":' по какой-то причине не выполняется, а сама функция вызывается с правильными аргументами. – makos