2017-08-29 3 views
-1

Ich schreibe ein Programm, wo der Benutzer eine Auswahl treffen wird basierend auf einem Zielbild. Ich versuche, das Programm dazu zu bringen, die Auswahlschaltflächen zu entfernen, und warte zwei Sekunden nach der Aktualisierung des Zielbilds, bevor die Auswahlmöglichkeiten erneut angezeigt werden. Der Code, den ich habe, scheint die angeklickte Taste für 2 Sekunden zu "deaktivieren", entfernt aber keine der beiden Tasten.Entfernen Sie Schaltflächen für ein paar Sekunden in 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

Haben Sie irgendwelche Nachforschungen angestellt? Es gibt viele Fragen auf dieser Seite über das Ausblenden von Widgets, und wahrscheinlich decken die meisten Tkinter-Tutorials das Thema auf die eine oder andere Weise ab. –

+0

Ich habe ausgiebig gesucht. Von allem, was ich gefunden habe, sollte der Code, den ich habe, funktionieren. Keine der gestellten Fragen, die ich gefunden habe, präsentiert die Widgets neu - sie entfernen sie einfach. –

+0

Eigentlich funktioniert das gut für mich ... die Knöpfe verschwinden. – ROAR

Antwort

0

die Probleme in Ihren after() Methoden. Sie müssen die Klammern für den Funktionsaufruf show_btns entfernen, sonst wird tkinter diesen Befehl nicht ordnungsgemäß ausführen. Wenn Sie eine Funktion ohne Argumente haben, verlassen Sie den Abschnitt ().

Wenn Sie Argumente zu tun haben, dann müssen Sie entweder auf diese Argumente in der nach Aussage liefern IE after(2000, some_func, arg1, arg2) oder lambda verwenden, um eine einmalige Funktion zu erstellen, die Arbeit wie after(2000, lambda: some_func(arg1, arg2)) zu tun. Lambda kann komplizierter sein, aber das ist das Grundkonzept.

Änderung:

after(2000, show_btns()) 

An:

after(2000, show_btns) 

Solange Ihre Wege, um Ihre Bilder funktioniert der folgende Code sollte wie vorgesehen.

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

Sie müssen nicht 'Lambda' für Positionsargumente verwenden. Sie können sie als Argumente für 'after' liefern (zB:' after (2000, some_function, arg1, arg2) ') –

+0

@BryanOakley Das war mir nicht bewusst. Danke für die Information. Ich hatte den Eindruck, dass Lambda die einzige Option ist, wenn Argumente benötigt werden. Ich werde meine Antwort aktualisieren. –

+0

Danke euch beiden! Mein Beispielcode für die Frage hatte keine Argumente, aber mein aktuelles Programm. Beide arbeiten jetzt. –

Verwandte Themen