【问题标题】:Display image using menu command in the same window with the menu在与菜单相同的窗口中使用菜单命令显示图像
【发布时间】:2012-06-03 03:03:04
【问题描述】:

我计划为我的程序提供很多方法,因此我需要在外部文件中实现这些方法,并在导入文件后将其添加到菜单命令中。但是由于菜单命令只接受方法的名称,如果我的方法接受参数,我不确定它是否可以工作。下面是在名为 file.py 的文件中显示图像的代码:

from tkinter import *
from tkinter.filedialog import askopenfilename
from PIL import Image, ImageTk

def open(root):
    filename = askopenfilename(filetypes=[("all files","*"),("Bitmap Files","*.bmp; *.dib"),
                                        ("JPEG", "*.jpg; *.jpe; *.jpeg; *.jfif"),
                                        ("PNG", "*.png"), ("TIFF", "*.tiff; *.tif")])
    image = Image.open(filename)
    image1 = ImageTk.PhotoImage(open(filename))
    root.geometry("%dx%d+%d+%d" % (image.size[0], image.size[1], 0, 0))
    panel = Label(root, image = image1)
    panel.pack(side='top', fill='both', expand='yes')
    panel.image = image1

我还有一个名为 gui.py 的文件,我在命令中调用上面的方法 open。所以我这样做了:

menu.add_command(label="Open", command=file.open)

我的想法是在与菜单相同的窗口中显示图像,所以我猜方法 open 需要带参数 root 所以在菜单中调用它时,图像将在该窗口中打开。我不确定这是否合乎逻辑,但这是我得到的错误:

Tkinter 回调 Traceback 中的异常(最近一次调用最后一次):
调用中的文件“D:\Python32\lib\tkinter__init__.py”,第 1399 行 return self.func(*args) TypeError: open() 只需要 1 个参数(给定 0)

我是 Python 新手,我的问题有点混乱,但我真的需要帮助。谢谢。

已编辑:

感谢有关绑定的评论,即使我不确定如何修复它,但是当我将参数添加到称为菜单命令的打开方法时,它可以工作,只是调用该方法而不是分配给命令。如何仅调用方法的名称但仍包含参数?这对我来说很奇怪。

【问题讨论】:

  • 基本上这就是异常所说的。您的 open() 函数需要 1 个参数 (root),但您的绑定不会将任何参数传递给回调。顺便说一句,open() 是用于生成文件对象的 python 内置函数,因此您应该将函数命名为其他名称。
  • 是的,我刚刚注意到,所以我更改了名称。但是抱歉,您能更具体地了解一下绑定吗?
  • 你在哪里定义file?是模块还是对象?

标签: python image menu tkinter


【解决方案1】:

感谢有关绑定的评论,即使我不确定如何修复它,但是当我将参数添加到称为菜单命令的打开方法时,它可以工作,只是调用该方法而不是分配给命令。

而不是使用

menu.add_command(label="Open", myfunc(myarg))

使用

menu.add_command(label="Open", lambda: myfunc(myarg))

这会添加参数,但会等待函数运行,直到 add_command 决定调用它。

More about lambda

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多