tkinter 不通过函数打开图像
tkinter doesn't open image via function
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()
如果我没记错的话,你的菜单会在你 运行 应用程序时打开,而不是在你单击导入按钮时打开。
这是因为您需要将回调传递给 add_command,但您却调用了该方法
file_menu.add_command(label = "Import...", command=input_file())
从 input_file() 中删除 ()。直接通过 input_file。它不会再直接调用该方法。
file_menu.add_command(label = "Import...", command=input_file)
以下是解决问题的方法:
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"])
一样工作,阅读一些文档 here
from tkinter import filedialog
a = filedialog.askopenfilename(title='Choose a file',initialdir='C:/',filetypes=(('All Files','*.*'),("JPEG
Files",'*.jpeg')))
希望这能帮助您解决错误,如有任何疑问,请告诉我。
干杯
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()
如果我没记错的话,你的菜单会在你 运行 应用程序时打开,而不是在你单击导入按钮时打开。
这是因为您需要将回调传递给 add_command,但您却调用了该方法
file_menu.add_command(label = "Import...", command=input_file())
从 input_file() 中删除 ()。直接通过 input_file。它不会再直接调用该方法。
file_menu.add_command(label = "Import...", command=input_file)
以下是解决问题的方法:
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"])
一样工作,阅读一些文档 herefrom tkinter import filedialog a = filedialog.askopenfilename(title='Choose a file',initialdir='C:/',filetypes=(('All Files','*.*'),("JPEG Files",'*.jpeg')))
希望这能帮助您解决错误,如有任何疑问,请告诉我。
干杯