1

我做了一个非常简单的 gui,它有一个按钮并显示一个图像(.gif)。我的目标是在您按下按钮时输出另一个 .gif。我的文件目录中有 2 个 .gif 文件,关键是每当您按下按钮时都要在这两个文件之间切换。

#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 来存储文件。(键=文件名,值=照片图像)。然后我们从字典中弹出第一个元素进行绘图。当然,如果您使用的是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 回答