1

ボタンがあり、画像 (.gif) を表示する非常に単純な GUI を作成しました。私の目標は、ボタンを押すたびに別の .gif を出力することです。私のファイル ディレクトリには 2 つの .gif ファイルがあり、ポイントは、ボタンを押すたびにこれら 2 つのファイルを切り替え続けることです。

#Using python2.7.2
import Tkinter

root = Tkinter.Tk()

try:
    n
except:
    n = 0

def showphoto(par):
    if par%2 == 0:
        try:
            label2.destroy()
        except:
            pass
        photo = Tkinter.PhotoImage(file="masc.gif")
        label2 = Tkinter.Label(image=photo)
        label2.image = photo
        label2.pack()

    else:
        try:
            label2.destroy()
        except: 
            pass
        photo = Tkinter.PhotoImage(file="123.gif")
        label2 = Tkinter.Label(image=photo)
        label2.image = photo
        label2.pack()

myContainer1 = Tkinter.Frame(root, width = 100, height = 100)
myContainer1.pack()

def callback(event):
    global n
    showphoto(n)
    n = n + 1

button1 = Tkinter.Button(myContainer1)
button1["text"]= "Next pic" 
button1["background"] = "green"
button1.bind("<Button-1>", callback(n))     
button1.pack()                 

root.mainloop()

現在のコードは最初の画像 ( masc.gif) を出力するだけですが、ボタンを押しても他の画像 ( ) に切り替わりません123.gif。私は何を間違っていますか?

4

2 に答える 2

3

クラスはグローバル変数を使用せずに必要なすべてのデータを保持するため、これはクラスを使用するとはるかに簡単に実現できます。

import Tkinter as tk
from collections import OrderedDict

class app(tk.Frame):
   def __init__(self,master=None, **kwargs):
      self.gifdict=OrderedDict()
      for gif in ('masc.gif','123.gif'):
          self.gifdict[gif]=tk.PhotoImage(file=gif)
      tk.Frame.__init__(self,master,**kwargs)
      self.label=tk.Label(self)
      self.label.pack()
      self.button=tk.Button(self,text="switch",command=self.switch)
      self.button.pack()
      self.switch()  

   def switch(self):
      #Get first image in dict and add it to the end
      img,photo=self.gifdict.popitem(last=False)
      self.gifdict[img]=photo
      #display the image we popped off the start of the dict.
      self.label.config(image=photo)

 if __name__ == "__main__":
   A=tk.Tk()
   B=app(master=A,width=100,height=100)
   B.pack()
   A.mainloop()

もちろん、これはより一般的に行うことができます...(たとえば、循環する画像のリストを渡すことができます)、これはself.gifs内のすべての画像を切り替えます...

このアプローチにより、毎回ラベルを破棄して再作成する必要がなくなり、代わりに既にあるラベルを再利用するだけです。

編集

今度は OrderedDict を使用してファイルを保存します。(キー = ファイル名、値 = PhotoImages)。次に、辞書から最初の要素を取り出してプロットします。もちろん、python2.6 以前を使用している場合は、辞書に加えてリストを保持し、そのリストを使用してキーを取得できます。

于 2012-04-21T17:12:42.520 に答える
1
button1 = Tkinter.Button(myContainer1)
button1["text"]= "Next pic" 
button1["background"] = "green"
button1.bind("<Button-1>", callback(n))

まず、<Button-1>イベントをバインドしますNone(これがcallback(n)評価対象です)。それをバインドする必要がありますcallback(呼び出し演算子とも呼ばれる括弧はありません)。

callback次に、引数を受け入れないように変更し、bind呼び出しを削除して、ボタンを次のように作成することをお勧めします。

button1 = Tkinter.Button(myContainer1, command=callback)
于 2012-04-22T19:46:35.830 に答える