如何在当前的python代码中使用GUI / Window?

时间:2013-05-02 00:35:35

标签: python tkinter

我已经按照教程在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()

基本上,你从大厅开始,然后探索一间卧室(不是真的,这只是一个简单的测试)。我很感激任何人的帮助或投入。

1 个答案:

答案 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_handlerlobby传递给currentGold,因此currentGold可以将其传递给currentGoldHandler。如果currentGold_handler需要从currentGold访问本地变量怎么办?您必须在本地定义currentGold_handler,以便将其用作闭包,或使用functools.partial将它们绑定在其中。依此类推。在你知道它之前,你有代码缩进了60个字符,不一致地使用了一些你没有设计的回调传递约定,直到你写了100个函数,其中40个函数以某种微妙的方式违反它。