python-3.x - tkinter 不通过函数打开图像
问题描述
Tkinter 不打开图像。我们可以错误地询问开头,我们需要帮助。我需要它通过菜单打开图像。一定要使用 pil,因为图像可以是任何东西。语法没有错误。谢谢=)
from tkinter import Tk, Frame, Menu, Canvas, PhotoImage
import easygui
from PIL import Image, ImageFilter, ImageTk
def input_file():
a = easygui.fileopenbox(filetypes=["*.jpg"])
original = Image.open(a)
original = original.resize((799, 799), Image.ANTIALIAS)
photoimg = ImageTk.PhotoImage(original)
canvas = Canvas(root, width=799, height=799)
imagesprite = canvas.create_image(10, 10,anchor='nw', image=photoimg)
canvas.pack()
return (imagesprite)
root = Tk()
root.title("Sputnikeca")
#root.iconbitmap('путь к иконке')
root.geometry("800x800+0+0")
my_menu = Menu(root)
root.config(menu=my_menu)
# Create a menu item
file_menu = Menu(my_menu)
my_menu.add_cascade(label = "Файл", menu=file_menu)
file_menu.add_command(label = "Импорт...", command=input_file())
file_menu.add_separator()
file_menu.add_command(label = "Выход", command=root.quit)
root.mainloop()
解决方案
以下是解决问题所必须执行的操作:
def input_file():
global photoimg #keeping a reference
a = easygui.fileopenbox(filetypes=["*.jpg"])
original = Image.open(a).resize((799, 799), Image.ANTIALIAS) #calling it all in one line
photoimg = ImageTk.PhotoImage(original)
canvas = Canvas(root, width=799, height=799)
imagesprite = canvas.create_image(10, 10,anchor='nw', image=photoimg)
canvas.pack()
return imagesprite
然后删除()
周围的功能:
file_menu.add_command(label = "Импорт...", command=input_file)
正在做什么?
在第一组代码中,我保留了对图像的引用,因此图像不会被 python 垃圾收集。您可以通过说
imagesprite.image = photoimg
或global photoimg
在功能顶部来做到这一点。我还在打开图像的同一行中调整了图像的大小,以减少代码。在第二组代码中,我只是删除
()
,以便在选择菜单项之前不调用(调用)该函数。而且 tkinter 本身也有一个
filedialogbox
像你一样工作的,在这里easygui.fileopenbox(filetypes=["*.jpg"])
阅读一些文档from tkinter import filedialog a = filedialog.askopenfilename(title='Choose a file',initialdir='C:/',filetypes=(('All Files','*.*'),("JPEG Files",'*.jpeg')))
希望这可以帮助您解决错误,如果有任何疑问,请告诉我。
干杯
推荐阅读
- react-native-firebase - 链接帐户时如何从“auth/credential-already-in-use”错误中恢复
- java - 如何通过托管 Bean 在类中设置属性?
- java - 邮递员表单数据发送带有文件的复杂对象
- java - 如何修复java下载按钮连续单击ClientAbortException:java.io.IOException错误?
- angular - 如何在 Ionic 中以编程方式触发管道?
- tensorflow - Tensorflow js:如何将 Frozen 模型转换为网络友好格式?
- objective-c - Objective C类的block属性如何实现
- protractor - WebDriverError:无法启动浏览器/模拟器错误
- reactjs - 如何在反应虚拟化中限制 onScroll 功能?
- javascript - 在客户端更改上传文件的名称