Ich bin ein Anfänger in Python, Tkinter. Ich habe einen Code geschrieben, der normalerweise ein Bild in einem Canvas anzeigen soll.Anzeigen eines Bildes in Python über Button und Canvas
Was passiert ist, dass der Hauptrahmen (gui) mit der Menüleiste angezeigt wird, wenn ich dann auf Bild laden klicke, verkleinert sich das GUI-Fenster (auf 100x100), aber nichts wird angezeigt.
Könnten Sie mir bitte erklären, warum das passiert, damit ich verstehen kann, wo der Fehler auftritt und wie Sie ihn korrigieren können?
# -*- coding:utf-8 -*-
# Imports
from tkinter import Tk, Menu, Canvas
from PIL import Image, ImageTk
# Function definitions
def deleteImage(canvas):
canvas.delete("all")
return
def loadImage(canvas, img):
filename = ImageTk.PhotoImage(img)
canvas.image = filename
canvas.create_image(0,0,anchor='nw',image=filename)
return
def quitProgram():
gui.destroy()
# Main window
gui = Tk()
# Inside the main gui window
#Creating an object containing an image
# A canvas with borders that adapt to the image within it
img = Image.open("fleur.jpg")
canvas = Canvas(gui,height=img.size[0],width=img.size[0])
canvas.pack()
# Menu bar
menubar = Menu(gui)
# Adding a cascade to the menu bar:
filemenu = Menu(menubar, tearoff=0)
menubar.add_cascade(label="Files", menu=filemenu)
# Adding a load image button to the cascade menu "File"
filemenu.add_command(label="Load an image", command=loadImage)
# Adding a delete image button to the cascade menu "File"
filemenu.add_command(label="Delete image", command=deleteImage)
filemenu.add_separator()
filemenu.add_command(label="Quit", command=quitProgram)
menubar.add_separator()
menubar.add_cascade(label="?")
# Display the menu bar
gui.config(menu=menubar)
gui.mainloop()
EDIT: Das zweite Problem ist, dass ich eine Leinwand und das Bild im Haupt gui Fenster erstellen möchten, und geben sie als Argumente für den Menütasten (siehe oben stehenden Code, wo img und Leinwand geschaffen getrennt von der Funktion loadImage
). Das Einfügen von Klammern in die command=loadImage()
verursachte ein Problem für sich.
Ein weiterer Punkt, der eine Frage in meinem Kopf aufwirft: In Bezug auf das erste Problem, das durch einen Verweis auf die filename=ImageTk.PhotoImage(img)
gelöst wurde. Wäre es nicht sinnlos, einen Verweis innerhalb der Funktion zu behalten, da es sich ohnehin um eine lokale Variable handelt?
Zum Hinzufügen eines Parameters zu Ihrem Befehl, überprüfen Sie bitte hier. http://stackoverflow.com/questions/6920302/how-to-pass-arguments-to-a-button-command-in-tkinter – Lafexlos
Ja, obwohl nicht durch die erste Lösung. Ich musste die partielle from functools-Bibliothek verwenden, die so funktionierte: 'file menu.add_command (label =" Lade ein Bild ", command = partially (loadImage, canvas, img))' – Aetos