Python 分别使用诅咒控制多个菜单

Python 分别使用诅咒控制多个菜单,python,python-3.x,ncurses,curses,Python,Python 3.x,Ncurses,Curses,一直在试图找出如何在诅咒中的两个独立菜单之间切换,但遇到了一些困难 我有两个菜单,如下所示: # 1st Window. def mainMenu(root, current_row, h, w): curses.init_pair(1, curses.COLOR_BLACK, curses.COLOR_WHITE) main_win = curses.newwin(h - 1, w // 2, 1, 1) main_win.border() main_opt

一直在试图找出如何在诅咒中的两个独立菜单之间切换,但遇到了一些困难

我有两个菜单,如下所示:

# 1st Window.
def mainMenu(root, current_row, h, w):
    curses.init_pair(1, curses.COLOR_BLACK, curses.COLOR_WHITE)

    main_win = curses.newwin(h - 1, w // 2, 1, 1)
    main_win.border()

    main_options = ["Enter data", "View data", "Exit"]

    for idx, element in enumerate(main_options):
        x = 1 + idx
        y = 1

        if idx == current_row:
            main_win.attron(curses.color_pair(1))
            main_win.addstr(y, x, element)
            main_win.attroff(curses.color_pair(1))
        else:
            main_win.addstr(y, x, element)

    main_win.refresh()

# 2nd window.
def secondMenu(root, current_row, h, w):
    curses.init_pair(1, curses.COLOR_BLACK, curses.COLOR_WHITE)

    second_win = curses.newwin(h - 1, w // 2, 1, w // 2 + 1)
    second_win.border()

    second_options = ["Option 1", "Option 2", "Option 3"]

    for idx, element in enumerate(second_options):
        x = 1 + idx
        y = 1

        if idx == current_row:
            second_win.attron(curses.color_pair(1))
            second_win.addstr(y, x, element)
            second_win.attroff(curses.color_pair(1))
        else:
            second_win.addstr(y, x, element)

    second_win.refresh()


def main(root):
    curses.curs_set(0)

    h, w = root.getmaxyx()

    current_row = 0

    mainMenu(root, current_row, h, w)

    while True:
        key = root.getch()

        if key == curses.KEY_UP and current_row > 0:
            current_row -= 1
        elif key == curses.KEY_DOWN and current_row < 2:
            current_row += 1
        elif key == ord("q"):
            break

        mainMenu(root, current_row, h, w)
        secondMenu(root, current_row, h, w)

    root.refresh()

curses.wrapper(main)
#第一个窗口。
def主菜单(根、当前行、h、w):
curses.init\u对(1,curses.COLOR\u黑色,curses.COLOR\u白色)
main_win=curses.newwin(h-1,w//2,1,1)
梅因·温·博德()
主选项=[“输入数据”、“查看数据”、“退出”]
对于idx,枚举中的元素(主选项):
x=1+idx
y=1
如果idx==当前_行:
main_win.attron(诅咒。颜色_对(1))
main_win.addstr(y、x、元素)
main_win.attroff(诅咒。颜色_对(1))
其他:
main_win.addstr(y、x、元素)
main_win.refresh()
#第二个窗口。
def第二菜单(根、当前行、h、w):
curses.init\u对(1,curses.COLOR\u黑色,curses.COLOR\u白色)
second_-win=curses.newwin(h-1,w//2,1,w//2+1)
第二次胜利
第二个选项=[“选项1”、“选项2”、“选项3”]
对于idx,枚举中的元素(第二个选项):
x=1+idx
y=1
如果idx==当前_行:
第二个胜利。阿特伦(诅咒。颜色对(1))
第二个胜利。添加str(y,x,元素)
第二个胜利。阿特洛夫(诅咒。颜色对(1))
其他:
第二个胜利。添加str(y,x,元素)
第二次胜利刷新()
def主(根):
诅咒。诅咒集(0)
h、 w=根目录。getmaxyx()
当前行=0
主菜单(根、当前行、h、w)
尽管如此:
key=root.getch()
如果key==curses.key\u UP且当前行>0:
当前_行-=1
elif key==curses.key\u DOWN和当前\u行<2:
当前_行+=1
elif键==ord(“q”):
打破
主菜单(根、当前行、h、w)
第二菜单(根、当前行、h、w)
root.refresh()
curses.wrapper(主)
这将输出一个垂直排列的菜单,在两个窗口上都可以高亮显示。但是,当我输入时,两个菜单同时滚动。我不确定如何将控件隔离到一个窗口或另一个窗口。非常感谢您的帮助。

问题是

如何将控件隔离到一个窗口或另一个窗口

curses库将光标移动到窗口中调用
getch
的当前位置。您的示例在每种情况下都使用根窗口,并在每次
getch
调用后重新创建这两个菜单(使用其引用被丢弃的
newwin
创建一个新窗口)。您可以在菜单之间切换(例如,当您读取制表符时),而不是创建(并丢弃窗口信息),预先执行
newwin
,并在循环中使用
main\u win
second\u win
变量