诅咒Python返回主菜单时不清除窗口

问题描述 投票:1回答:1

[6 years ago,他们提出了一个很好的解决方案,但是我的更改导致了意外的结果,当我调用子菜单功能和主菜单时,窗口无法清除,帮助我了解问题所在。

import curses
from curses import panel
from test_print import get_menu_list, get_timings, time_to_seconds, GetPageChoise,\
main_menu_items, list_of_themes_end, text_discription_get

page = GetPageChoise()
class Menu(object):

    def __init__(self, items, stdscreen):
        self.window = stdscreen.subwin(5,2)
        self.window.keypad(1)
        self.panel = panel.new_panel(self.window)
        self.panel.hide()
        panel.update_panels()

        self.position = 0
        self.items = items
        self.items.append(('exit','exit'))

    def navigate(self, n):
        self.position += n
        if self.position < 0:
            self.position = 0
        elif self.position >= len(self.items):
            self.position = len(self.items)-1

    def display(self):
        self.panel.top()
        self.panel.show()
        self.window.clear()
        while True:
            self.window.refresh()
            curses.doupdate()
            for index, item in enumerate(self.items):

                if index == self.position:
                    mode = curses.A_REVERSE
                else:
                    mode = curses.A_NORMAL

                msg = '%d. %s' % (index, item[0])
                self.window.addstr(10+ index, 1, msg, mode)
            key = self.window.getch()

            if key in [curses.KEY_ENTER, ord('\n')]:
                if self.position == len(self.items)-1:
                    break
                else:
                    self.items[self.position][1]()

            elif key == curses.KEY_UP:
                self.navigate(-1)

            elif key == curses.KEY_DOWN:
                self.navigate(1)
        self.window.clear()
        self.panel.hide()
        panel.update_panels()
        curses.doupdate()


class SubMenu(object):

    def __init__(self, items, stdscreen):
        self.window = stdscreen.subwin(5,2)
        self.window.keypad(1)
        self.panel = panel.new_panel(self.window)
        self.panel.hide()
        panel.update_panels()

        self.position = 0
        self.items = items
        self.items.append(('exit','exit'))

    def navigate(self, n):
        self.position += n
        if self.position < 0:
            self.position = 0
        elif self.position >= len(self.items):
            self.position = len(self.items)-1

    def display_sub(self):
        while True:
            self.window.refresh()
            curses.doupdate()
            for index, item in enumerate(self.items):

                if index == self.position:
                    mode = curses.A_REVERSE
                else:
                    mode = curses.A_NORMAL
                next = 1
                for disript in text_discription_get():
                    self.window.addstr(next, 1, disript)
                    next +=1
                msg = '%d. %s' % (index, item[0])
                self.window.addstr(10+ index, 1, msg, mode)
            key = self.window.getch()
            if key in [curses.KEY_ENTER, ord('\n')]:
                if self.position == len(self.items)-1:
                    break
                else:
                    self.items[self.position][1]()

            elif key == curses.KEY_UP:
                self.navigate(-1)

            elif key == curses.KEY_DOWN:
                self.navigate(1)


class MyApp(object):

    def __init__(self, stdscreen):
        self.screen = stdscreen
        curses.curs_set(0)

        submenu_items = [
                ('beep', curses.beep),
                ('flash', curses.flash)
                ]
        submenu = SubMenu(sub_menu_items, self.screen) #Вывел конкретный подкаст, нужно изменить на выбор подкастов.

        main_menu_items = [
                ('beep', curses.beep),
                ('flash', curses.flash),
                ('submenu', submenu.display_sub)
                ]
        main_menu = Menu(main_menu_items, self.screen)
        main_menu.display()

if __name__ == '__main__':
    curses.wrapper(MyApp)
#Вывел меню, сделал выбор, нужно вывести Discription, сделать вызов плеера по выбору темы.

您可以在GIF上看到它的样子,事实是建议的解决方案不适合,因为子菜单应根据选择每次显示新内容。gif how work this

python submenu curses
1个回答
0
投票

在显示该子菜单的功能之后对我有用的功能后插入clear()

class Menu(object):
    ...
    def display(self):
        ...
        if key in [curses.KEY_ENTER, ord('\n')]:
            if self.position == len(self.items)-1:
                break
            else:
                self.items[self.position][1]()
                self.window.clear() # This will clear the main menu window every time an item is selected

您还应该清除显示另一个窗口的屏幕[[之前,因为如果子菜单小于主菜单,可能会发生相同的事情。

或者,您可以在每个循环的开始时清除窗口,因为您已经在每次按键后重新绘制列表。这样,您可以更新菜单中的项目,而不会像使用当前程序那样看到旧菜单的某些部分。
© www.soinside.com 2019 - 2024. All rights reserved.