2016-08-02 9 views
1

ユーザにクリックを要求するたびに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()メソッドを使用してテキストを入力ウィジェットの内容と比較するために、コールバックでクリックされたボタン(実際のコードでは実行しないもの)を特定する必要があります。

ngame()に増やすには、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つの別々のフレームを作成し、 'pack()'の代わりに 'grid()'を使用してボタンを追加することができます。各フレームに対して、その行(フレームあたり1行)と列(コード中の 'j 'の数に等しい)を設定して、重みが1になるようにします。もちろん、' width'と 'height'を各ボタン。それは機能しなければならない。 –

関連する問題