如何使用我的当前Python代码的GUI /窗口?
我遵循了一个关于在Python中制作简单的基于文本的游戏的教程。我要用我从中学到的东西来做一个后启示录的文字冒险。一切正常,但我并不想仅仅使用命令控制台作为游戏。相反,我想用一个窗口,我知道这个窗口可以用Tkinter来完成。我只是不知道如何。如何使用我的当前Python代码的GUI /窗口?
我问的是如果有一种方法可以添加一个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()
基本上,你在大厅开始,然后探索一间卧室(不是真的,这只是一个简单的测试)。我会感谢任何人的帮助或意见。
通常,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个以一些微妙的方式违反了它。
请修复此代码的缩进;它很难阅读(甚至更难以调试,因为它不会运行)。 – abarnert 2013-05-02 01:00:33