You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

能否用Curses调用普通Python函数?菜单功能实现咨询

如何用标准Python函数结合Curses实现菜单选项关联调用

当然可以用标准Python语法编写函数,再通过Curses调用——这是curses菜单程序的常规实现方式。核心逻辑就是给每个菜单选项绑定对应的Python函数,在用户选中选项并按下回车时执行绑定的函数。

具体实现步骤

    1. 为每个菜单选项编写对应的标准Python函数(如果需要操作curses界面,函数可接收stdscr参数)
    1. 建立菜单选项与函数的映射关系(用列表配对最直观,顺序和菜单列表一致)
    1. 在回车事件触发时,根据当前选中的菜单索引调用对应函数

修改后的完整代码

import curses

# 菜单选项列表
menu = ['Set Wallet Address', 'Start BTC Miner', 'Currency', 'Exit']

# 定义各个菜单对应的标准Python函数
def set_wallet_address(stdscr):
    # 这里可以编写设置钱包地址的实际逻辑,示例用提示文本展示
    print_center(stdscr, 'Wallet Address Set Successfully!')
    stdscr.getch()  # 等待用户按键后返回主菜单

def start_btc_miner(stdscr):
    print_center(stdscr, 'BTC Miner Started!')
    stdscr.getch()

def change_currency(stdscr):
    print_center(stdscr, 'Currency Type Updated!')
    stdscr.getch()

def exit_program(stdscr):
    # 退出前可添加资源清理逻辑,这里直接返回即可
    pass

# 菜单与函数的映射(顺序必须和menu列表完全对应)
menu_functions = [
    set_wallet_address,
    start_btc_miner,
    change_currency,
    exit_program
]

# 居中打印菜单
def print_menu(stdscr, selected_row_idx):
    stdscr.clear()
    h, w = stdscr.getmaxyx()
    for idx, row in enumerate(menu):
        x = w//2 - len(row)//2
        y = h//2 - len(menu)//2 + idx
        if idx == selected_row_idx:
            stdscr.attron(curses.color_pair(1))
            stdscr.addstr(y, x, row)
            stdscr.attroff(curses.color_pair(1))
        else:
            stdscr.addstr(y, x, row)
    stdscr.refresh()  # 将refresh移到循环外,避免重复刷新界面

# 居中打印文本
def print_center(stdscr, text):
    stdscr.clear()
    h, w = stdscr.getmaxyx()
    x = w//2 - len(text)//2
    y = h//2
    stdscr.addstr(y, x, text)
    stdscr.refresh()

def main(stdscr):
    # 关闭光标闪烁
    curses.curs_set(0)
    # 初始化选中行的颜色方案
    curses.init_pair(1, curses.COLOR_BLACK, curses.COLOR_WHITE)
    current_row = 0

    print_menu(stdscr, current_row)

    while True:
        key = stdscr.getch()

        if key == curses.KEY_UP and current_row > 0:
            current_row -= 1
        elif key == curses.KEY_DOWN and current_row < len(menu)-1:
            current_row += 1
        elif key == curses.KEY_ENTER or key in [10, 13]:
            # 根据当前选中的行,调用对应的函数
            selected_func = menu_functions[current_row]
            selected_func(stdscr)
            # 选中最后一个选项时退出程序
            if current_row == len(menu)-1:
                break

        print_menu(stdscr, current_row)

curses.wrapper(main)

关键修改说明

  • 新增了每个菜单对应的标准Python函数,函数内部可以编写任意业务逻辑,需要操作curses界面时,通过传入的stdscr对象调用curses方法即可。
  • 用menu_functions列表实现菜单与函数的绑定,顺序和menu列表严格对应,通过索引就能快速匹配选中项的执行函数,逻辑清晰且易维护。
  • 优化了原代码中的print_menu函数,将stdscr.refresh()移到循环外,避免重复刷新界面导致闪烁。

注意事项

原代码中的clr()函数使用print输出换行清屏,在curses环境下可能会干扰界面显示,建议替换为stdscr.clear()来实现屏幕清理。

内容的提问来源于stack exchange,提问作者borat

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 23:25:32