繁体   English   中英

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

[英]How can I use a GUI/Window with my current python code?

我遵循了有关使用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()

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM