能否用Curses调用普通Python函数?菜单功能实现咨询
如何用标准Python函数结合Curses实现菜单选项关联调用
当然可以用标准Python语法编写函数,再通过Curses调用——这是curses菜单程序的常规实现方式。核心逻辑就是给每个菜单选项绑定对应的Python函数,在用户选中选项并按下回车时执行绑定的函数。
具体实现步骤
- 为每个菜单选项编写对应的标准Python函数(如果需要操作curses界面,函数可接收
stdscr参数)
- 为每个菜单选项编写对应的标准Python函数(如果需要操作curses界面,函数可接收
- 建立菜单选项与函数的映射关系(用列表配对最直观,顺序和菜单列表一致)
- 在回车事件触发时,根据当前选中的菜单索引调用对应函数
修改后的完整代码
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
相关产品推荐
相关产品推荐

