2017-08-29 5 views
-1

私はユーザーがターゲット画像に基づいて選択を行うプログラムを書いています。私は選択ボタンを削除するプログラムを取得しようとしている、選択肢の選択肢が再提示される前に、ターゲットイメージを更新して2秒待つ。私が持っているコードは、クリックしたボタンを2秒間「無効にする」ようですが、どちらのボタンも削除しません。Python/Tkinterで数秒間ボタンを削除しますか?

from tkinter import * 
import random 

root = Tk() 
root.geometry("500x500") 


def click_b(event): 
    btn_b.pack_forget() 
    btn_c.pack_forget() 
    new_a() 
    root.update() 
    root.after(2000, show_btns()) 


def click_c(event): 
    btn_b.pack_forget() 
    btn_c.pack_forget() 
    new_a() 
    root.update() 
    root.after(2000, show_btns()) 


def new_a(): 
    k = random.randrange(1, 3) 
    if k == 1: 
     btn_a.configure(image=a1) 
    elif k == 2: 
     btn_a.configure(image=a2) 


def show_btns(): 
    btn_b.pack(side=LEFT) 
    btn_c.pack(side=RIGHT) 

a1 = PhotoImage(file="A1.gif") 
a2 = PhotoImage(file="A2.gif") 
orange = PhotoImage(file="orange_btn.gif") 
green = PhotoImage(file="yellowgreen_btn.gif") 
btn_a = Button(root, image=a1) 
btn_a.pack() 

btn_b = Button(root, image=orange) 
btn_b.bind('<Button-1>', click_b) 
btn_b.pack(side=LEFT) 

btn_c = Button(root, image=green) 
btn_c.bind('<Button-1>', click_c) 
btn_c.pack(side=RIGHT) 

root.mainloop() 
+0

あなたは調査を行っていますか?このサイトには、ウィジェットを隠すことに関する多くの質問があります。おそらく、ほとんどのtkinterチュートリアルでは、件名をある意味でカバーしています。 –

+0

私は広範囲に検索しました。私が見つけたすべてのものから、私のコードはうまくいくはずです。尋ねられた質問のうち、ウィジェットを見つけて再表示することはできませんでした。 –

+0

実際、これは私のためにうまくいきます...ボタンは消えます。 – ROAR

答えて

0

問題はafter()の方法にあります。 show_btns関数呼び出しの角括弧を削除する必要があります。そうでないと、tkinterはこのコマンドを正しく実行しません。引数のない関数をお持ちの場合は、()の部分を省略します。

引数がある場合は、after文IE after(2000, some_func, arg1, arg2)にこれらの引数を指定するか、lambdaを使用してafter(2000, lambda: some_func(arg1, arg2))のような処理を行う1つの関数を作成する必要があります。ラムダはもっと複雑になりますが、これが基本的な考え方です。

変更:限り、意図したとおりにあなたのイメージにあなたのパスが正常に動作として、以下のコードは動作するはずです

after(2000, show_btns) 

:へ

after(2000, show_btns()) 

from tkinter import * 
import random 

root = Tk() 
root.geometry("500x500") 

def click_b(event): 
    btn_b.pack_forget() 
    btn_c.pack_forget() 
    new_a() 
    root.update() 
    root.after(2000, show_btns) 

def click_c(event): 
    btn_b.pack_forget() 
    btn_c.pack_forget() 
    new_a() 
    root.update() 
    root.after(2000, show_btns) 

def new_a(): 
    k = random.randrange(1, 3) 
    if k == 1: 
     btn_a.configure(image=a1) 
    elif k == 2: 
     btn_a.configure(image=a2) 

def show_btns(): 
    btn_b.pack(side=LEFT) 
    btn_c.pack(side=RIGHT) 

a1 = PhotoImage(file="A1.gif") 
a2 = PhotoImage(file="A2.gif") 
orange = PhotoImage(file="orange_btn.gif") 
green = PhotoImage(file="yellowgreen_btn.gif") 
btn_a = Button(root, image=a1) 
btn_a.pack() 

btn_b = Button(root, image=orange) 
btn_b.bind('<Button-1>', click_b) 
btn_b.pack(side=LEFT) 

btn_c = Button(root, image=green) 
btn_c.bind('<Button-1>', click_c) 
btn_c.pack(side=RIGHT) 

root.mainloop() 
+0

位置引数に 'lambda'を使う必要はありません。 'after'(2000年、some_function、arg1、arg2)のように' after'の引数として指定することができます。 –

+0

@BryanOakley私はそれを知らなかった。情報をありがとう。私は、引数が必要な場合にラムダが唯一の選択肢だったという印象を受けました。私は私の答えを更新します。 –

+0

ありがとうございました!質問のサンプルコードには議論がありませんでしたが、私の実際のプログラムはそうしました。どちらも現在動作しています。 –

関連する問題