我是一个在python中的begginer,tkinter。我编写了一个通常应该在画布中显示图像的代码。在蟒蛇中通过按钮和画布显示图像
发生了什么事是主框架(gui)与菜单栏一起显示,然后当我点击加载图像时,gui窗口缩小(我猜测为100x100),但没有任何内容显示在内。
能否请您为什么发生这种情况,所以我能理解错误发生,以及如何纠正它给我解释一下吗?
# -*- 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()
编辑: 第二个问题是,我想创建画布和在主GUI窗口中的图像,并且将它们作为参数传递给菜单按钮(参见上面的代码,其中创建IMG和帆布与函数loadImage
分开)。看到在command=loadImage()
中插入括号就会造成问题。
发源于我的头一个问题还有一点:就被保持到filename=ImageTk.PhotoImage(img)
参考解决了第一个问题。在函数内部保留引用通常不会毫无意义,因为它本身就是一个局部变量?
要添加一个参数到你的命令,请点击这里。 http://stackoverflow.com/questions/6920302/how-to-pass-arguments-to-a-button-command-in-tkinter – Lafexlos
是的,虽然不是第一个解决方案。我不得不使用部分从functools库,它的工作是这样的:'filemenu.add_command(标签=“加载图像”命令=部分(的LoadImage,帆布,IMG))' – Aetos