如何使用我的当前Python代码的GUI /窗口?

如何使用我的当前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() 

基本上,你在大厅开始,然后探索一间卧室(不是真的,这只是一个简单的测试)。我会感谢任何人的帮助或意见。

+0

请修复此代码的缩进;它很难阅读(甚至更难以调试,因为它不会运行)。 – abarnert 2013-05-02 01:00:33

通常,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通过lobbycurrentGold,所以currentGold可以将它传递给currentGoldHandler。那么如果currentGold_handler需要从currentGold访问局部变量呢?您必须在本地定义currentGold_handler,以便您可以将其用作封闭,或使用functools.partial将它们绑定。等等。在你知道它之前,你的代码缩进了60个字符,不一致地使用了一些你没有设计的回调传递约定,直到你写了100个函数,其中40个以一些微妙的方式违反了它。