0

我遵循了一个关于用 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()

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

4

1 回答 1

3

通常,必须将 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 个以某种微妙的方式违反了它。

于 2013-05-02T01:00:03.127 回答