我已经按照教程在Python中制作一个简单的基于文本的游戏。我将利用我从中学到的东西来制作一个后世界末日的文本冒险。一切正常,但我真的不想只使用命令控制台作为游戏。相反,我想使用一个窗口,我知道可以用Tkinter完成。我只是不知道如何。
我要问的是,是否有办法在现有功能中添加GUI或窗口。代码如下:
#A simple text-based game test
global table
table=0
def start():
print 'Welcome'
global gold
gold=0
lobby()
def lobby():
print 'You are in the lobby.'
command=prompt()
if command=='north':
bedroom()
elif command=='gold':
currentGold()
lobby()
elif command=='end':
return
else:
lobby()
def prompt():
x=raw_input('Type a command: ')
return x
def currentGold():
global gold
print 'current gold: ', gold
def bedroom():
global gold, table
print 'You are in the bedroom'
command=prompt()
if command=='south':
lobby()
elif command=='bed':
print 'You return to your bed and find nothing'
bedroom()
elif command=='table':
if table==0:
print 'You go to the table and find 50 gold'
gold=gold+50
table=1
bedroom()
else:
print 'There is nothing else on the table'
bedroom()
elif command=='gold':
currentGold()
bedroom()
elif command=='end':
return
else:
bedroom()
start()
基本上,你从大厅开始,然后探索一间卧室(不是真的,这只是一个简单的测试)。我很感激任何人的帮助或投入。
答案 0 :(得分:2)
通常,GUI程序必须重写为事件循环,而不仅仅是一系列代码。
例如,如果你编写一个只等待输入的函数,那么整个GUI将永远等待输入,这意味着你无法响应鼠标拖动或其他任何东西,你的窗口管理器将显示一个沙滩球或弹出一个“死程序”对话框或以其他方式提醒用户你的程序被“冻结”。
相反,你必须编写一个函数,它只是建立一个输入对话框,附加一个处理程序或回调函数,当输入进入对话框时运行,然后返回。
所以,代码看起来像这样:
def lobby():
print 'You are in the lobby'
command=prompt()
if command == 'north':
bedroom()
elif command=='gold':
currentGold()
lobby()
elif command=='end':
return
else:
lobby()
......必须分成两半,如下:
def lobby():
display_text('You are in the lobby')
prompt_window = PromptWindow(handler = lobby_handler)
prompt_window.show()
def lobby_handler(command):
if command == 'north':
bedroom()
elif command=='gold':
currentGold()
lobby()
elif command=='end':
return
else:
lobby()
如果这没有意义,您可能需要先按照一些教程来构建一些简单的GUI应用程序,然后才能将现有程序转换为GUI应用程序。
将功能分成两半就是快速&将顺序代码转换为基于事件的代码的脏方法,但并不总是最好的。这是结束“回调地狱”的好方法。
例如,如果currentGold
弹出一个对话框并等待用户点击它,我们又不想回到lobby
直到他们点击它?实现此功能的唯一方法是lobby_handler
将lobby
传递给currentGold
,因此currentGold
可以将其传递给currentGoldHandler
。如果currentGold_handler
需要从currentGold
访问本地变量怎么办?您必须在本地定义currentGold_handler
,以便将其用作闭包,或使用functools.partial
将它们绑定在其中。依此类推。在你知道它之前,你有代码缩进了60个字符,不一致地使用了一些你没有设计的回调传递约定,直到你写了100个函数,其中40个函数以某种微妙的方式违反它。