2017-08-29 114 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將不會正確運行此命令。如果你有一個沒有參數的函數,你可以忽略()部分。

如果你有爭論,那麼你要麼需要提供這些參數在IE after(2000, some_func, arg1, arg2)會後聲明或使用lambda創建一個關閉功能做的工作就像after(2000, lambda: some_func(arg1, arg2))。拉姆達可以更復雜,但這是基本概念。

變化:

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'(例如:'(after,(2000,some_function,arg1,arg2)') –

+0

@BryanOakley我沒有意識到這一點。謝謝(你的)信息。我的印象是,如果需要論證,lambda是唯一的選擇。我會更新我的答案。 –

+0

謝謝你們兩位!我的問題示例代碼沒有爭論,但我的實際程序。兩人現在都在工作。 –