2017-10-24 3 views
0

Ich habe einen zufälligen Operator-Namen-Generator für Rainbox Six Siege programmiert und ich möchte das Operator-Bild erscheinen, wenn ihr Name auftaucht. Das Bild erscheint gut, aber es wird nicht verschwinden. Das ist mein Code:Wie man das Bild in tkinter verschwindet

from tkinter import * 
    import tkinter 
    import random 

    names = ['Sledge','Thatcher','Ash','Thermite','Twitch','Montagne','Glaz','Fuze','Blitz','IQ','Buck','Blackbeard','Capitão','Hibana'] 
    name = ["Smoke","Mute","Castle","Pulse","Doc","Rook","Kapkan","Tachanka","Jäger","Bandit","Frost","Valkyrie","Caveira","Echo"] 
    root = tkinter.Tk() 
    def pickName(): 
     rad = random.choice(names) 
     photo = PhotoImage(file=rad+".png") 
     label = Label(image=photo) 
     label.image = photo # keep a reference! 
     label.pack() 
     nameLabel.configure(text=rad, foreground="white", background="blue") 
     root.configure(background='blue') 
    def pickName1():  nameLabel.configure(text=random.choice(name),background="orange",foreground="black") 
     root.configure(background='orange') 



    root.title("Operator Picker") 

    root.geometry("250x100") 

    nameLabel = tkinter.Label(root, text="", font=('Helvetica', 32)) 
    nameLabel.pack() 
    Grid() 

    f1 = tkinter.Frame(root, height=100, width=100) #defines frame size in 
    pixels 
    f1.pack(side=tkinter.LEFT) #packs on the left 
    f1.pack_propagate(0) #tells frame not to let children control size 
    pickButton1 = tkinter.Button(f1, command=pickName, text="Pick       
    Attack",background="blue",foreground="white") 
    pickButton1.pack(fill=tkinter.BOTH, expand=1) #takes up all available space 

    f2 = tkinter.Frame(root, height=100, width=100) 
    f2.pack(side=tkinter.RIGHT) 
    f2.pack_propagate(0) 
    pickButton2 = tkinter.Button(f2, command=pickName1, text="Pick 
    Defend",background="orange",foreground="black") 
    pickButton2.pack(fill=tkinter.BOTH, expand=1) 

    root.mainloop() 

Hinweis: Dies ist immer noch ein WIP, alles, was ich muss wissen, wie die Bilder, um loszuwerden, sobald sie erscheinen. So sieht es aus, wenn mehr als ein Bild angezeigt wird: https://imgur.com/eroXLLn

+0

ich nirgendwo sehen, wo Sie sogar versuchen, das alte Widget weg gehen zu machen. Du zerstörst es nicht, und du versteckst es nicht. –

+0

@BryanOakley Ich denke, er weiß nicht, wie man das macht. – Nae

+0

@BryanOakley ja Ich weiß nicht, wie man es zerstört, das ist mein Problem –

Antwort

2

Sie fügen jedes Mal, wenn Sie diese Funktion aufrufen, ein neues Label hinzu. Stattdessen sollten Sie das Label nur einmal (wahrscheinlich in der Initialisierungsphase) erstellen und das Bild aktualisieren. So wie Sie den Text für nameLabel aktualisieren und den Schritt, um die Referenz beizubehalten.

photo_label = tkinter.Label() 
def pickName(): 
    rad = random.choice(names) 
    photo = PhotoImage(file=rad+".png") 
    photo_label.configure(image = photo) 
    photo_label.image = photo # keep a reference! 
    photo_label.pack() 

    nameLabel.configure(text=rad, foreground="white", background="blue") 

und Ihren ganzen Code sollte wie folgt aussehen:

from tkinter import * 
import tkinter 
import random 

names = ['Sledge','Thatcher','Ash','Thermite','Twitch','Montagne','Glaz','Fuze','Blitz','IQ','Buck','Blackbeard','Capitão','Hibana'] 
name = ["Smoke","Mute","Castle","Pulse","Doc","Rook","Kapkan","Tachanka","Jäger","Bandit","Frost","Valkyrie","Caveira","Echo"] 
root = tkinter.Tk() 
photo_label = tkinter.Label() 
def pickName(): 
    rad = random.choice(names) 
    photo = PhotoImage(file=rad+".png") 
    photo_label.configure(image = photo) 
    photo_label.image = photo # keep a reference! 
    photo_label.pack() 

    nameLabel.configure(text=rad, foreground="white", background="blue") 
    root.configure(background='blue') 
def pickName1():  nameLabel.configure(text=random.choice(name),background="orange",foreground="black") 
root.configure(background='orange') 



root.title("Operator Picker") 

root.geometry("250x100") 

nameLabel = tkinter.Label(root, text="", font=('Helvetica', 32)) 
nameLabel.pack() 
Grid() 

f1 = tkinter.Frame(root, height=100, width=100) #defines frame size inpixels 
f1.pack(side=tkinter.LEFT) #packs on the left 
f1.pack_propagate(0) #tells frame not to let children control size 
pickButton1 = tkinter.Button(f1, command=pickName, text="PickAttack",background="blue",foreground="white") 
pickButton1.pack(fill=tkinter.BOTH, expand=1) #takes up all available space 

f2 = tkinter.Frame(root, height=100, width=100) 
f2.pack(side=tkinter.RIGHT) 
f2.pack_propagate(0) 
pickButton2 = tkinter.Button(f2, command=pickName1, text="PickDefend",background="orange",foreground="black") 
pickButton2.pack(fill=tkinter.BOTH, expand=1) 

root.mainloop() 
+0

photo_label ist nicht definiert –

+0

@AidanChristopher Ich denke 'photo_label' heißt' label' in deinem eigenen Codeausschnitt. – Nae

+0

@AidanChristopher Ich denke, dieser Ansatz ist viel besser. Es ist im Grunde, was du mit dem 'nameLabel' auch machst, es ist also konsistenter. Fügen Sie einfach 'photo_label = tkinter.Label()' vor 'def pickName():' dieser Antwort hinzu. – Nae

Verwandte Themen