所以我一直在为我的一个文字游戏上的菜单处理程序工作,这样制作菜单会占用播放器硬盘的更少空间,但在使用我在这里找到的一段代码之后在stackOverflow上,我发现代码不允许输入模块以字符串形式导入它。我的基本目标是能够从一行代码创建菜单。我有大部分工作,除了我不知道如何使用一个或两个字符串从方法调用函数。
我找到的代码:
function = globals().copy()
function.update(locals())
function.get(call)(*actionsList)
目前,call是我要调用的函数,action列表只是一个参数列表。我不知道这是多么安全或有效,但我知道使用像" moduleX.functionY"这样的字符串。实际上并没有从moduleX调用functionY。有没有办法做到这一点?
完整代码(仅供参考):
Menu Handler:
import subprocess as sp
import Menus
def callMenu(Options, Instructions):
tmp = sp.call('cls',shell=True)
for key, value in Options.iteritems():
print key
print ""
print Instructions
processMenu(Options, Instructions)
def processMenu(Options, Instructions):
actionsList = []
menuInput = ""
menuInput = raw_input("")
results = processInput(Options, menuInput)
if results[0]:
for key, value in Options[results[1]].items():
call = key
actionsList = value
function = globals().copy()
function.update(locals())
function.get(call)(*actionsList)
else:
callMenu(Options, Instructions)
def processInput(Options, menuInput):
processedOptions = 0
optionsList = []
answer = False
for key, value in Options.items():
optionsList.append(key)
while processedOptions < len(Options):
currentKey = optionsList[processedOptions]
if str(menuInput.lower()) == currentKey.lower():
answer = True
break
processedOptions += 1
return [answer, currentKey]
def DEBUG(DUMMY):
tmp = sp.call('cls',shell=True)
print "%s selected" % DUMMY
menuInput = raw_input("")
Menus.MainMenu.MenuMain000()
Main Menu:
from Handlers import MenuHandler
def MenuMain000():
MenuHandler.callMenu({"New Game": {"DEBUG": ["New Game"]}, "Load Game": {"DEBUG": ["Load Game"]}}, "Pick something will ya")
#def MenuMain100(DUMMY):
#print "%s selected" % DUMMY
我希望能够通过菜单调用来使用MenuMain001而不是DUMMY
MenuHandler.callMenu({"New Game": {"MenuMain001": ["New Game"]}, "Load Game": {"MenuMain001": ["Load Game"]}}, "Pick something will ya")
答案 0 :(得分:0)
将函数本身传递给callMenu()
,而不是将其名称作为字符串传递:
MenuHandler.callMenu({"New Game": {DEBUG: ["New Game"]}, "Load Game": {DEBUG: ["Load Game"]}}, "Pick something will ya")
然后,在processMenu()
中,调用该函数而不是使用globals()
执行所有操作:
call(*actionsList)