-2

グリッド上に Tkinter ブックを作成しました。ナビゲーション ボタンは左の行を下にスクロールし、写真は多くの行にまたがって右の列に表示されるため、ボタンは適切に表示されます。このTkinterの本を作るとき。グリッド上にボタンを作成しました

left1 = Button(win, text=" Captian Scarlet ")# win, is root master
left1.configure(command=but1)# but1 is my first def
left1.grid(row=1, column=0)# all the buttons are on the left list

これは定義のないボタンのように表示および機能します

それから私はデフを作りました

def but1():
    img = Image.open("captain_scarlett.gif")# loads the gif file
    intro = ImageTk.PhotoImage(img)# loads image drivers I belevie
    right1 = Label(win, image=intro)# I think Lable is used the same as html <span>
    right1.grid(row=0, column=1, rowspan=13)# image formatting to display correctly with buttons

当時の私は教育を受けていなかったので、画像を定義の外に表示することしかできませんでした。それで、欲求不満で、「このコードは、定義に入れなくても完璧に機能する」と投稿しました。落ち着いたとき、オンラインで見つけることができなかった知識が必要だったので、質問をしました:では、このコードを def 内で機能させるにはどうすればよいですか?

4

2 に答える 2

0

このコードは完璧に機能します。これで、私の制作は本格的に進むことができます

これが完成したコードです

def but1():
    img = Image.open("captain_scarlett.gif")
    intro = ImageTk.PhotoImage(img)
    right = Label(win, image=intro)
    right.grid(row=0, column=1, rowspan=14)
    right.image=intro
于 2013-02-22T20:44:42.267 に答える
0

うまくいかないと思う理由は何ですか?この点に関して、Tkinter について特別なことは何もありません。defの外で機能するものはすべて、def内で確実に機能します。唯一の注意事項は、すべての Python コードで同じです。たとえば、def 内で作成した変数は、特に宣言しない限りローカルであり、def の実行後にオブジェクト (ウィジェットではない) がガベージ コレクションされる場合があります。

おそらく何が起こっているのかというと、画像を作成し、その参照をローカル変数に保存しているということです。def が実行を停止すると、イメージ オブジェクトはガベージ コレクションされます。永続化できるイメージへの参照を保持する必要があります。簡単な解決策の 1 つは、次のようにすることですright1.image=intro

于 2013-02-22T11:47:36.160 に答える