0

私は Tkinter GUI を作成して、画像を呼び出す以外は何もしません。もちろん、適切な tkinter ドキュメントを見つけるのにずっと苦労してきました。

要求どおりに実行できないように見えるコード行があります-辞書内のすべての値を呼び出し、次の値が呼び出される前に、同じ名前で画像を個別に印刷およびプルしたいです。私は dict.itervalues() と dict.values() を試しましたが、まったく何もわからないようです...

とにかく、ここにスニペットがあります:

for key in ansDict.iterkeys(): #using the iterkeys function... kind of
    x=key

    root = tk.Tk() # root window created (is this in the right place?)
    root.title('C H E M I S T R Y   A B C\'s')

    frameAns=tk.Frame(root)
    frameAns.grid(row=0, column=0, sticky=tk.NW)

    for i in range(len(ansDict[x])):
        print '-->' + ansDict[x][i]

    for value in ansDict.itervalues(): #This is the most important part

        for i in range(len(value)): #pulls value list from dictionary named ansDict
            picRef1 = Image.open(value[i] + '.jpg') #calls image file by the same name using PIL
            photo1 = ImageTk.PhotoImage(picRef1, master=root)

            button1 = tk.Button(frameAns, compound=tk.TOP, image=photo1, text=str(value[i]) + '\nClose me!', bg='white') #pulls up button onto which the image is pasted
            button1.grid(sticky=tk.NW, padx=2, pady=2) #places button on grid
            button1.image=photo1

            root.mainloop()

最後に、1 つまたは 2 つの画像が表示され、次のエラーが表示されます。

TclError: 「image」コマンドを呼び出せません: アプリケーションが破棄されました

何が悪いのかわかりません。画像コマンドを移動できません。何らかの方法で「保存」して、破棄されないようにする必要があります。ここに他のコード エラーがあることはわかっていますが、取得している TclError を把握できれば、他のすべてを正しく設定できると思います。

これをすべて行う簡単な方法があれば教えてください!

4

3 に答える 3

0

あなたの例とは構造が異なりますが、これが1つの可能性です。4 つの 100 ピクセルの正方形の画像を積み重ねます。各 Image オブジェクトへの個別の参照を保持する必要があると思われるため、画像辞書にそれらを隠しておきました。

from Tkinter import *
import os
from PIL import Image, ImageTk

image_names = { '1':'one','2':'two','3':'three','4':'four' }
images = {}

root = Tk()
root.title("HELLO")
frm = Frame(root)

for v in image_names.itervalues():
   images[v] = {}
   images[v]['i']  = Image.open("%s%s.jpg" % (os.path.dirname(__file__), v))
   images[v]['pi'] = ImageTk.PhotoImage(images[v]['i'])
   images[v]['b']  = Button(frm, image=images[v]['pi'])
   images[v]['b'].pack()

frm.pack()

mainloop()

PhotoImage クラスについて説明している良いリンクを次に示します。

http://effbot.org/tkinterbook/photoimage.htm

于 2011-05-26T05:04:41.167 に答える
0

イベント駆動型プログラミングのアイデアが得られなかったようです。GUI全体を一度作成し、ウィジェットで埋め、イベントをセットアップしてから無限ループに入る必要があります。GUI は、イベントと関数のバインディングに基づいてコールバック関数を呼び出す必要があります。したがって、プログラムのこれらの部分は、必ず一度だけ呼び出す必要があります: root = tk.Tk(), root.mainloop().

編集:イベント駆動型プログラミングの「アイデア例」を追加しました。

from Tkinter import *

master = Tk()

def callback():
    print "click!"

b = Button(master, text="OK", command=callback)
b.pack()

mainloop()
于 2011-05-26T05:06:12.023 に答える