2013-05-02 68 views
0

我遵循了一個關於在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

回答

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_handler通過lobbycurrentGold,所以currentGold可以將它傳遞給currentGoldHandler。那麼如果currentGold_handler需要從currentGold訪問局部變量呢?您必須在本地定義currentGold_handler,以便您可以將其用作封閉,或使用functools.partial將它們綁定。等等。在你知道它之前,你的代碼縮進了60個字符,不一致地使用了一些你沒有設計的回調傳遞約定,直到你寫了100個函數,其中40個以一些微妙的方式違反了它。

相關問題