0

このコードを見てください。

#normal template stuff
from Tkinter import *
from PIL import Image, ImageTk
win=Tk()
win.geometry('+0+0')
win.title(" Borderlands 2 Chicks")
#How to add intro photo
img = Image.open("intro.gif")
intro = ImageTk.PhotoImage(img)
right = Label(win, image=intro)
right.grid(row=0, column=1, rowspan=5)


#defernitions to call photos
def but1():
img = Image.open("captain_scarlett.gif")
intro = ImageTk.PhotoImage(img)
right1 = Label(win, image=intro)
right1.grid(row=0, column=1, rowspan=5,)    

def but2():
img = Image.open("Ellie.gif")
intro = ImageTk.PhotoImage(img)
right = Label(win, image=intro)
right.grid(row=0, column=1, rowspan=5)

def but3():
img = Image.open("Gaige Swin Suit.gif")
intro = ImageTk.PhotoImage(img)
right = Label(win, image=intro)
right.grid(row=0, column=1, rowspan=5)

def but4():
img = Image.open("Gaige.gif")
intro = ImageTk.PhotoImage(img)
right = Label(win, image=intro)
right.grid(row=0, column=1, rowspan=5)


#buttons on the left column
left1 = Button(win, text=" Captian Scarlet")
left1.configure(command=but1)
left2 = Button(win, text=" Button 2 ")
left2.configure(command=but2)
left3 = Button(win, text=" Button 3 ")
left3.configure(command=but3)
left4 = Button(win, text=" Button 4 ")
left4.configure(command=but4)
left1.grid(row=0, column=0)
left2.grid(row=2, column=0)
left3.grid(row=3, column=0)
left4.grid(row=4, column=0)

#how to get buttons to do something
def but1(): print "Button one was pushed"

mainloop()

このアプリは最初はうまく表示されます。最初のボタンを押すと、右の列が完全に白くなります。必要なのは、ボタンを押した後、右側の列にある現在の写真を置き換えるコードです。勉強Destroy()してgrid_forget()いますが、このアプリで動作するサンプルコードが見つかりません。助けてください。

4

1 に答える 1

0

問題は、関数で画像を作成し、それらの画像への参照をローカル変数に格納していることです。関数が終了すると、ローカル変数はスコープ外になり、画像オブジェクトはガベージ コレクションされます。イメージへの永続的な参照を保持する必要があります。

コードのもう 1 つの問題は、ボタンを押すたびに新しい画像と新しいラベルが作成されることです。時間が経つにつれて、これは不必要に多くのメモリを使い果たします。新しいボタンや画像を作り続ける必要はありません。イメージのラベルは、作成後に変更できます。

たとえば、画像の単純なリストを作成し、ボタンを押したときにラベルを再構成できます。これが私がそれを行う方法の例です:

import Tkinter as tk

class View(tk.Frame):
    def __init__(self, *args, **kwargs):
        tk.Frame.__init__(self, *args, **kwargs)
        self._initialize_images()
        self.right1 = tk.Label(self, image=self.images[0])
        self.right1.grid(row=0, column=1, rowspan=5)

        b1 = tk.Button(self, text="Button 1", command=self.set_image_1)
        b2 = tk.Button(self, text="Button 2", command=self.set_image_2)
        b3 = tk.Button(self, text="Button 3", command=self.set_image_3)
        b4 = tk.Button(self, text="Button 4", command=self.set_image_4)

        b1.grid(row=0, column=0)
        b2.grid(row=2, column=0)
        b3.grid(row=4, column=0)
        b4.grid(row=6, column=0)

    # these can all be consolidated into a single function with the number
    # passed in as a parameter. I chose not to do that since that might
    # add confusion for someone just learning how to write Tkinter code
    def set_image_1(self):
        self.right1.configure(image=self.images[1])
    def set_image_2(self):
        self.right1.configure(image=self.images[2])
    def set_image_3(self):
        self.right1.configure(image=self.images[3])
    def set_image_4(self):
        self.right1.configure(image=self.images[4])

    def _initialize_images(self):
        self.images = []
        self.images.append(tk.PhotoImage(file="intro.gif"))
        self.images.append(tk.PhotoImage(file="captain_scarlett.gif"))
        self.images.append(tk.PhotoImage(file="Ellie.gif"))
        self.images.append(tk.PhotoImage(file="Gaige Swin Suit.gif"))
        self.images.append(tk.PhotoImage(file="Gaige.gif"))


if __name__ == "__main__":
    root = tk.Tk()
    view = View(root)
    view.pack(side="top", fill="both", expand=True)
    root.mainloop()

注: GUI の作成がかなり簡単になるため、オブジェクト指向スタイルを使用することにしました。クラスを使用してメイン ウィンドウを定義すると、グローバル名前空間を乱雑にすることなく、他のオブジェクトへの永続的な参照を保持する便利な場所が得られます。

于 2013-02-22T14:52:42.460 に答える