我需要在python中使用curses构建一个Menu。 当用户选择选项时,它在子模块中运行一个函数。
我首先有一个包含菜单结构的json文件:
[
{
"name": "Action A",
"function": "main.foo.actionA"
},
"name": "Action B",
"function": "main.bar.actionB"
}
]
我有一个主脚本调用下面的menu.load方法:
import curses
import json
class menu:
def __init__(self):
self.curses = curses
self.screen = self.curses.initscr()
self.menuItems = json.loads(<my json menu file>)
def load(self):
x = 0
while x != ord('q'):
self.screen.addstr(2, 2, "Make your choice")
i=1
for item in self.menuItems:
self.screen.addstr(i, 4, item['name'])
i+=1
self.screen.refresh()
x = self.screen.getch()
if x == <my id item id matching the menu>:
//for example
self.run("main.bar.actionB")
def run(self, action):
function = action.split('.')
// Clear the screen, remove curse stuff so I can see intercative things in the terminal
_temp = __import__("lib.functions.%s" % function[0], globals(), locals(), [function[1]], -1)
mod = getattr(_temp, function[1])()
result = getattr(mod, function[2])()
// Once run is done, get back to menu
self.load()
这样工作正常(我没有粘贴所有代码,因为有子菜单)。 但是,当用户第一次运行第一个动作时,它可以工作。 然后,一旦用户返回菜单,他可以再次运行相同的操作,然后,我可以看到该操作运行两次。 如果我第三次运行相同的动作,它会运行三次......等等
我首先虽然导入器每次导入菜单然后找到某种参考...所以我试图添加控件:
try:
<run the function>
except AtributeError:
//function is not loaded, load it
但它没有用......