2015-06-14 8 views
1

Есть способ сделать прокручивающееся меню в python-curses? У меня есть список записей, которые я получил из запроса в sqlite3, и я должен показать их в поле, но они больше, чем максимальное количество строк: могу ли я сделать небольшое меню, чтобы показать их все, не рушив проклятия?Как создать меню прокрутки в python-curses

ответ

4

Этот код позволяет вам создать небольшое меню в окне из списка строк.
Вы также можете использовать этот код, получая список строк из SQL-запроса или из файла csv.
Чтобы отредактировать максимальное количество строк меню, вам просто нужно отредактировать max_row.
Если вы нажмете кнопку ввода, программа напечатает выбранное строковое значение и его позицию.

from __future__ import division #You don't need this in Python3 
import curses 
from math import * 



screen = curses.initscr() 
curses.noecho() 
curses.cbreak() 
curses.start_color() 
screen.keypad(1) 
curses.init_pair(1,curses.COLOR_BLACK, curses.COLOR_CYAN) 
highlightText = curses.color_pair(1) 
normalText = curses.A_NORMAL 
screen.border(0) 
curses.curs_set(0) 
max_row = 10 #max number of rows 
box = curses.newwin(max_row + 2, 64, 1, 1) 
box.box() 


strings = [ "a", "b", "c", "d", "e", "f", "g", "h", "i", "l", "m", "n" ] #list of strings 
row_num = len(strings) 

pages = int(ceil(row_num/max_row)) 
position = 1 
page = 1 
for i in range(1, max_row + 1): 
    if row_num == 0: 
     box.addstr(1, 1, "There aren't strings", highlightText) 
    else: 
     if (i == position): 
      box.addstr(i, 2, str(i) + " - " + strings[ i - 1 ], highlightText) 
     else: 
      box.addstr(i, 2, str(i) + " - " + strings[ i - 1 ], normalText) 
     if i == row_num: 
      break 

screen.refresh() 
box.refresh() 

x = screen.getch() 
while x != 27: 
    if x == curses.KEY_DOWN: 
     if page == 1: 
      if position < i: 
       position = position + 1 
      else: 
       if pages > 1: 
        page = page + 1 
        position = 1 + (max_row * (page - 1)) 
     elif page == pages: 
      if position < row_num: 
       position = position + 1 
     else: 
      if position < max_row + (max_row * (page - 1)): 
       position = position + 1 
      else: 
       page = page + 1 
       position = 1 + (max_row * (page - 1)) 
    if x == curses.KEY_UP: 
     if page == 1: 
      if position > 1: 
       position = position - 1 
     else: 
      if position > (1 + (max_row * (page - 1))): 
       position = position - 1 
      else: 
       page = page - 1 
       position = max_row + (max_row * (page - 1)) 
    if x == curses.KEY_LEFT: 
     if page > 1: 
      page = page - 1 
      position = 1 + (max_row * (page - 1)) 

    if x == curses.KEY_RIGHT: 
     if page < pages: 
      page = page + 1 
      position = (1 + (max_row * (page - 1))) 
    if x == ord("\n") and row_num != 0: 
     screen.erase() 
     screen.border(0) 
     screen.addstr(14, 3, "YOU HAVE PRESSED '" + strings[ position - 1 ] + "' ON POSITION " + str(position)) 

    box.erase() 
    screen.border(0) 
    box.border(0) 

    for i in range(1 + (max_row * (page - 1)), max_row + 1 + (max_row * (page - 1))): 
     if row_num == 0: 
      box.addstr(1, 1, "There aren't strings", highlightText) 
     else: 
      if (i + (max_row * (page - 1)) == position + (max_row * (page - 1))): 
       box.addstr(i - (max_row * (page - 1)), 2, str(i) + " - " + strings[ i - 1 ], highlightText) 
      else: 
       box.addstr(i - (max_row * (page - 1)), 2, str(i) + " - " + strings[ i - 1 ], normalText) 
      if i == row_num: 
       break 



    screen.refresh() 
    box.refresh() 
    x = screen.getch() 

curses.endwin() 
exit() 

Screenshot of the code

+0

Это, кажется, тот же ответ, как указано на странице [свитка постранично или построчно с помощью питона ругательства] (http://stackoverflow.com/questions/30795161/scroll-page ая-страница или строка за строкой-помощи-питон-проклятия). –

+0

Я ответил ему тем же ответом, и я сказал ему, что ответ, который я ему дал, был таким же для этого вопроса –

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

  • Нет связанных вопросов^_^