1

私は単純な「Simon」ゲームを書こうとしていますが、ここで障害にぶつかりました。正直なところ、それを回避する方法がわかりません。

ここでは、GUI の 4 つのボタンのクラスを作成しました。

class button:
    def buttonclicked(self):
            self.butclicked= True

    def checkIfClicked(self):
            if self.butclicked== True:
                    global pressed
                    pressed.append(self.color)
                    self.butclicked= False

    def __init__(self, color1):
            self.color= color1
        self.button= tk.Button(root, text=' '*10, bg= self.color, command= self.buttonclicked)
        self.button.pack(side='left')
        self.butclicked=False

blue, red, yellow, and green as bb, rb, yb,次に、とでこのクラスの 4 つのインスタンスを作成しましたgb

すべてが Tk() モジュールにパックされると、リスト activecolors にランダムな色を追加する while ループに入ります。次のループを使用して、押されたリストがアクティブカラーのリストと少なくとも同じ長さになるまで待ってから、2つを比較してユーザーが正しかったかどうかを確認します。

while len(pressed)<len(activecolors):
                    sleep(.25)
                    print('In the check loop')
                    bb.checkIfClicked()
                    rb.checkIfClicked()
                    yb.checkIfClicked()
                    gb.checkIfClicked()

ただし、while ループ内でスタックしているため、プログラムはボタンがクリックされたことを認識できません。スリープ メソッドをループに追加すると、コードが他の処理 (プロセス ボタンのクリックなど) を実行できるようになると思いましたが、そうではありません。どんな助けでも大歓迎です。

見たい場合は、完全なコードへのリンクを次に示します。ただし、警告: きれいではありません。

編集:新しいボタンがクリックされた後にのみリストをチェックするようにコードを変更して、コードの準備ができていることをコンピューターに伝えました。ご覧になりたい場合は、Google ドキュメントを更新しました。

4

1 に答える 1

1

あなたはそれをあまりにも複雑にしています。このプログラムは、functiontools のパーシャルを使用して変数を関数に渡せるようにするため、1 つの関数ですべてのクリックが処理されます (Python 2.7)。

from Tkinter import *
from functools import partial

class ButtonsTest:
    def __init__(self):
        self.top = Tk()
        self.top.title('Buttons Test')
        self.top_frame = Frame(self.top, width =400, height=400)
        self.colors = ("red", "green", "blue", "yellow")
        self.colors_selected = []
        self.num_clicks = 0
        self.wait_for_number = 5
        self.buttons()
        self.top_frame.grid(row=0, column=1)

        Button(self.top_frame, text='Exit', 
         command=self.top.quit).grid(row=2,column=1, columnspan=5)

        self.top.mainloop()

    ##-------------------------------------------------------------------         
    def buttons(self):
        for but_num in range(4):
            b = Button(self.top_frame, text = str(but_num+1), 
                  command=partial(self.cb_handler, but_num))
            b.grid(row=1, column=but_num+1)

    ##----------------------------------------------------------------
    def cb_handler( self, cb_number ):
        print "\ncb_handler", cb_number
        self.num_clicks += 1
        this_color = self.colors[cb_number]
        if (self.num_clicks > self.wait_for_number) \
             and (this_color in self.colors_selected):
            print "%s already selected" % (this_color)
        self.colors_selected.append(this_color)

##===================================================================
BT=ButtonsTest()
于 2013-07-02T01:23:11.143 に答える