2016-08-02 87 views
1

我想每次提示一個字母串,要求用戶點擊,只有當用戶按下正確的鍵時,遊戲纔會繼續。Python tkinter條目提示

我遇到了按鍵部分的問題。我想獲取按鈕上的文本,並測試它是否與提示的字母相匹配,如果匹配的條目小部件將提示下一個字母,否則它只是保持不動。

我隨機導入隨機混合字母,以便每次都會生成不同的字母。我沒有添加random.shuffle(alist),因爲它不起作用。

這裏是我的代碼:

from tkinter import * 
from tkinter.ttk import * 
import random 
import tkinter 

class KeyboardGame: 
    def __init__(self): 
     window = Tk() 
     window.title('haha') 
     self.value = StringVar() 
     self.value.set('click on any key to start...') 
     btm_frame = Frame(window, relief=RAISED) 
     entry = Entry(window, text=self.value) 
     entry.grid(row=0, column=0, padx=40, pady=5, sticky='EW') 
     for i in ['ixnsywfhze', 'uobpqgtav', 'lmjkcdr']: 
      frame1 = Frame(btm_frame) 
      for j in i: 
       button = Button(frame1, text=j, command=self.game) 
       button.pack(side=LEFT) 
       frame1.pack(padx=2, pady=2) 

     btm_frame.grid(row=1, column=0, padx=5, pady=5) 
     window.mainloop() 



    def game(self): 
     n = 0 
     alist = ['h', 'c', 'p', 'e', 'm', 'n', 'd'] 

     self.value.set(alist[n]) 
     while button['text'] != alist[n]: 
      self.value.set(alist[n]) 
     n += 1 



KeyboardGame() 

回答

2

您可以通過binding同一事件來創建每個按鈕解決您的問題。

因此,在您的回調中,您需要確定被點擊的按鈕(您的實際代碼不會執行的操作),以便使用cget()方法將其文本與條目窗口小部件的內容進行比較。

請注意,爲了在game()內部增加n,您需要將其渲染爲instance variable。當它達到與alist相同的值時,您必須小心不要增加它。

完整程序

這裏是上面提到的想法實現。請注意,我專注於解決您的問題。這意味着我不會評論的最佳做法,應遵循:

from tkinter import * 
from tkinter.ttk import * 
import tkinter 

class KeyboardGame: 

    def __init__(self): 
     window = Tk() 
     window.title('haha') 
     self.value = StringVar() 
     self.value.set('h') 
     self.btm_frame = Frame(window, relief=RAISED) 
     self.entry = Entry(window, text=self.value) 
     self.entry.grid(row=0, column=0, padx=40, pady=5, sticky='EW') 
     self.n = 0 

     for i in ['ixnsywfhze', 'uobpqgtav', 'lmjkcdr']: 
      self.frame1 = Frame(self.btm_frame) 
      for j in i: 
       button = Button(self.frame1, text=j) 
       button.pack(side=LEFT) 
       button.bind("<Button-1>", self.game) 
       self.frame1.pack(padx=2, pady=2) 

     self.btm_frame.grid(row=1, column=0, padx=5, pady=5) 
     window.mainloop() 



    def game(self, event): 
     alist = ['h', 'c', 'p', 'e', 'm', 'n', 'd'] 
     w = event.widget # Identify the button 
     if w.cget("text") == self.value.get() and self.n < 6: 
      self.n = self.n + 1 
      self.value.set(alist[self.n]) 

# Start program 
if __name__ =="__main__": 
    KeyboardGame() 

演示

下面是上面的程序運行的截圖:

enter image description here

+0

嗨Billal,感謝解決問題。我還需要使鍵看起來平方,我試圖設置高度和寬度,但它不起作用。你能幫我嗎? – chrisgjh

+0

您可以創建3個獨立的框架(如您所做的那樣)並添加按鈕usign'grid()'而不是'pack()'。對於每一幀,將其行(每幀一行)和列(等於代碼中'j's的數量)配置爲權重等於1.當然,設置「寬度」和「高度」爲每個按鈕。它必須工作。 –