2017-11-24 1 views
-1

Ich kann nicht für das Leben in mir herausfinden, warum das nicht funktioniert. Ich verwende TKinter, um ein Bild in Python anzuzeigen. Der Code, den ich geschrieben habe, so weit ist hier zu sehen:tkinter zeigt keine Bilder auf Formen

from tkinter import * 
from tkinter import messagebox 

def unlock(): 
    root.withdraw() 


    def logout(): 
     inside.destroy() 
     root.deiconify() 

    ####################### 
    ###     ### 
    ### unlock Form ### 
    ###     ### 
    ####################### 


    inside = Tk() 
    inside.geometry("576x576") 
    inside.title("SAFE CRACKER") 
    # LABELS, Textboxes and Buttons 
    imageInside = PhotoImage(file = "images/inside.gif") 
    imageLabel = Label(inside,image = imageInside).grid(row =1, columnspan = 2) 
    label = Label(inside, text="Safe Cracker", font = ("Arial",16)).grid(row = 0, columnspan = 2) 
    exitButton = Button(inside, text = "Exit", width = 15, command = logout) 
    exitButton.grid(row = 3, column = 0,padx = 10, pady = 10) 



####################### 
###     ### 
### Main Form ### 
###     ### 
####################### 


root = Tk() 
root.geometry("430x450") 
root.title("SAFE CRACKER") 
# LABELS, Textboxes and Buttons 
label = Label(root, text="Safe Cracker", font = ("Arial",16)).grid(row = 0, columnspan = 2) 
imageSafe = PhotoImage(file = "images/safe.gif") 
imageLabel = Label(root,image = imageSafe).grid(row =1, columnspan = 2) 
label = Label(root, text = "Enter the code", font = ("Arial",12)).grid(row = 2, column = 0) 
unlockCode = Entry(root, width = 30) 
unlockCode.grid(row = 2, column = 1,padx = 10, pady = 10) 
exitButton = Button(root, text = "Exit", width = 15, command = exit).grid(row = 3, column = 0,padx = 10, pady = 10) 
enterButton = Button(root, text = "Enter the VAULT", width = 15, command = unlock).grid(row = 3, column = 1,padx = 10, pady = 10) 

Der Code nicht viel gegenwärtig tut, aber etwas ist es auf ich arbeite. Wenn ich das Programm starte, wird ein Bild von einem Safe (Great) angezeigt, und wenn ich auf den Button klicke, geht es zum nächsten Formular über.

image of safe working

Auf der neuen Form der Bild, Etiketten und Tasten, jedoch nicht angezeigt werden, wenn der Bildcode funktioniert es entfernt wird alle swimmingly.

Zunächst dachte ich über das Setzen der Wurzelform innerhalb einer Funktion, aber immer wenn ich diesen Code innerhalb einer Funktion platziere, kann er das Bild nicht laden (ahhhh). Können diese Bilder nicht in Funktionen platziert werden?

+0

vielleicht erhalten Sie errror und es kann Form nicht anzeigen. Hast du es in der Konsole ausgeführt, um zu sehen, ob du eine Fehlermeldung bekommst? – furas

+0

BTW: wenn Sie 'var = Widget (...). Grid()' tun, dann weist es 'None' zu' var' zu, weil 'grid()' (und 'pack()') 'None' zurückgibt, nicht Widget. Wenn Sie 'var' benötigen, um später auf das Widget zuzugreifen, müssen Sie es in zwei Zeilen Code' 'var = Widget (...)' und 'var.grid()' eingeben. Wenn Sie später nicht 'var' verwenden müssen, können Sie ein Widget ohne' var' erstellen. Es bedeutet "Widget (...). Grid()' – furas

+0

'tkinter' sollte nur ein' Tk() '- verwenden, um das Hauptfenster zu erstellen. Andere Fenster sollten Sie mit 'Toplevel()' – furas

Antwort

1

Sie müssen einen Verweis auf das Foto behalten.

imageInside = PhotoImage(file = "images/inside.gif") 
imageLabel = Label(inside,image = imageInside) 
imageLabel.grid(row =1, columnspan = 2) 
imageLabel.photo_ref = imageInside # keep a reference! 
+0

Als Sie für die Hilfe, aber das hat nicht funktioniert. Es kam damit zurück: imageLabel = Label (inside, image = imageInside) Datei "C: \ Programme \ Python36 \ lib \ tkinter \ __ init__.py", Zeile 2760, in __init__ Widget .__ init __ (selbst, Master , 'label', cnf, kw) Datei "C: \ Programme \ Python36 \ lib \ tkinter \ __ init__.py", Zeile 2293, in __init__ (widgetName, self._w) + extra + self._options (cnf)) _tkinter.TclError: Bild "pyimage2" existiert nicht –

+0

@NeosNokia Sie sollten das lieber auf Ihre Frage bearbeiten. – Nae

0

Vielen Dank für Ihre Hilfe.

Ich kann bestätigen, dass dies funktioniert, hier ist der Code.

from tkinter import * 
from tkinter import messagebox 

def unlock(): 
    root.withdraw() 


    def logout(): 
     inside.destroy() 
     root.deiconify() 

    ####################### 
    ###     ### 
    ### unlock Form ### 
    ###     ### 
    ####################### 


    inside = Toplevel() 
    inside.geometry("576x576") 
    inside.title("SAFE CRACKER") 
    # LABELS, Textboxes and Buttons 
    imageInside = PhotoImage(file = "images/inside.gif") 
    imageLabel = Label(inside,image = imageInside) 
    imageLabel.grid(row =1, columnspan = 2) 
    imageLabel.photo_ref = imageInside 
    label = Label(inside, text="Safe Cracker", font = ("Arial",16)).grid(row = 0, columnspan = 2) 
    exitButton = Button(inside, text = "Exit", width = 15, command = logout) 
    exitButton.grid(row = 3, column = 0,padx = 10, pady = 10) 



####################### 
###     ### 
### Main Form ### 
###     ### 
####################### 


root = Tk() 
root.geometry("430x450") 
root.title("SAFE CRACKER") 
# LABELS, Textboxes and Buttons 
label = Label(root, text="Safe Cracker", font = ("Arial",16)).grid(row = 0, columnspan = 2) 
imageSafe = PhotoImage(file = "images/safe.gif") 
imageLabel = Label(root,image = imageSafe).grid(row =1, columnspan = 2) 
label = Label(root, text = "Enter the code", font = ("Arial",12)).grid(row = 2, column = 0) 
unlockCode = Entry(root, width = 30) 
unlockCode.grid(row = 2, column = 1,padx = 10, pady = 10) 
exitButton = Button(root, text = "Exit", width = 15, command = exit).grid(row = 3, column = 0,padx = 10, pady = 10) 
enterButton = Button(root, text = "Enter the VAULT", width = 15, command = unlock).grid(row = 3, column = 1,padx = 10, pady = 10)