【问题标题】:tkinter doesn't open image via functiontkinter 不通过函数打开图像
【发布时间】:2020-09-19 06:43:40
【问题描述】:

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()

【问题讨论】:

标签: python-3.x tkinter python-imaging-library tkinter-canvas tkinter-menu


【解决方案1】:

您必须采取以下措施来解决问题:

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 = photoimgglobal 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')))
    

希望这可以帮助您解决错误,如果有任何疑问,请告诉我。

干杯

【讨论】:

  • 文件 "canvas.py", line 11, in input_file imagesprite.image = photoimg #保持引用 AttributeError: 'int' object has no attribute 'image' 3点后出现新错误!感谢来自俄罗斯联邦的学生的帮助
  • @АртёмМакаренко 加上你发布整个错误代码并用它更新你的Q以及你尝试过的整个代码
【解决方案2】:

如果我没记错的话,您的菜单会在您运行应用程序时打开,而不是在您单击导入按钮时打开。

这是因为您需要将回调传递给 add_command,但您正在调用该方法

file_menu.add_command(label = "Import...", command=input_file())

从 input_file() 中删除 ()。只需传递 input_file。它不会再直接调用该方法了。

file_menu.add_command(label = "Import...", command=input_file)

【讨论】:

  • 这不会解决图像不出现的问题,我猜
  • @CoolCloud 这就是为什么我添加了 如果我没记错的话,因为问题不是很清楚,而且看起来 OP 对英语不太满意,'我需要它通过菜单打开图像。 ' 是我认为的问题所在。
猜你喜欢
  • 2021-10-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-25
  • 2013-07-07
  • 1970-01-01
  • 2023-03-03
  • 1970-01-01
相关资源
最近更新 更多