1

私は自分のプログラムに非常に多くのメソッドを用意することを計画しているので、これらを外部ファイルに実装し、ファイルをインポートした後にメニュー コマンドに追加する必要があります。しかし、メニュー コマンドはメソッドの名前しかとらないので、私のメソッドがパラメーターを受け取る場合に機能するかどうかはわかりません。以下は、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 メソッドはパラメータ ルートを取得する必要があると思います。そのため、メニューで呼び出されると、そのウィンドウで画像が開かれます。それがロジックかどうかはわかりませんが、ここに私が得たエラーがあります:

Tkinter コールバック Traceback の例外 (最新の呼び出しは最後):
ファイル "D:\Python32\lib\tkinter__init__.py"、1399 行目、呼び出しで return self.func(*args) TypeError: open() は正確に 1 つの引数を取ります (0与えられた)

私はPythonが初めてで、私の質問は少し面倒ですが、本当に助けが必要です. ありがとう。

編集:

バインディングについてのコメントをありがとうございます。修正方法はわかりませんが、メニュー コマンドとして呼び出される open メソッドにパラメータを追加すると、メソッドがコマンドに割り当てられるのではなく呼び出されることを除いて機能します。メソッドの名前だけを呼び出して、パラメータを含めるにはどうすればよいですか? これは私にとって奇妙です。

4

1 に答える 1

2

バインドについてのコメントありがとうございます。修正方法はわかりませんが、メニューコマンドと呼ばれるopenメソッドにパラメーターを追加すると、コマンドに割り当てられる代わりにメソッドが呼び出される以外は機能します。

使用する代わりに

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

使用する

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

これにより引数が追加されますが、add_commandが引数を呼び出すことを決定するまで関数の実行を待機します。

ラムダについての詳細

于 2012-06-03T03:32:20.137 に答える