Есть способ сделать прокручивающееся меню в python-curses? У меня есть список записей, которые я получил из запроса в sqlite3, и я должен показать их в поле, но они больше, чем максимальное количество строк: могу ли я сделать небольшое меню, чтобы показать их все, не рушив проклятия?Как создать меню прокрутки в python-curses
1
A
ответ
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()
Это, кажется, тот же ответ, как указано на странице [свитка постранично или построчно с помощью питона ругательства] (http://stackoverflow.com/questions/30795161/scroll-page ая-страница или строка за строкой-помощи-питон-проклятия). –
Я ответил ему тем же ответом, и я сказал ему, что ответ, который я ему дал, был таким же для этого вопроса –