簡體   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