2013-03-05 64 views
3

我是一个python新手,并且已经制作了一个有点奇怪的幻灯片脚本,它可以循环显示图像,并且还可以从另一个文件中获取变量来“解决”图像。使用Python在屏幕上的图像之间淡出使用Python TKinter/imageTK

我确定我的代码是悲剧性的。但它确实有效(见下文)!

我的问题是 - 我如何让它在图像之间褪色而不是生涩暂时去白色然后到它目前的下一个图像?是否有我应该看的转换模块?

from Tkinter import * 
import Image, ImageTk, random, string 

class MyApp(Tk): 

def __init__(self): 
    Tk.__init__(self) 
    fr = Frame(self) 
    fr.pack() 
    self.canvas = Canvas(fr, height = 400, width = 600) 
    self.canvas.pack() 

    self.old_label_image = None 
    self.position = 0 
    self.command = 0 
    self.oldcommand = 0 

    self.slideshow() 
    self.debug() 

def debug(self): 
    self.QUIT = Button(self) 
    self.QUIT["text"] = "QUIT!" + str(self.command) 
    self.QUIT["fg"] = "red" 
    self.QUIT["command"] = self.quit 

    self.QUIT.pack({"side": "right"}) 

def slideshow (self): 

    if self.command != self.oldcommand: 
     self.after_cancel(self.huh) 
     # run through random between 2-5 changes 
     # then settle on command for 30 seconds 
     self.title("Title: PAUSE") 
     self.oldcommand = self.command 
     self.slideshow() 
    else: 
     file = str(self.position) + '.jpg' 
     image1 = Image.open(file) 
     self.tkpi = ImageTk.PhotoImage(image1) 
     label_image = Label(self, image=self.tkpi) 
     label_image.place(x=0,y=0,width=image1.size[0],height=image1.size[1]) 
     self.title("Title: " + file) 

     if self.old_label_image is not None: 
      self.old_label_image.destroy() 
     self.old_label_image = label_image 

     # make this random instead of pregressional 
     if self.position is not 1: 
      self.position = self.position + 1 
     else: 
      self.position = 0 

     commandfile = open('command.txt', 'r') 
     self.command = string.atoi(commandfile.readline()) 
     commandfile.close() 

     int = random.randint(2000, 5000) 
     self.huh = self.after(int, self.slideshow) 
     #self.after_cancel(huh) - works ! so maybe can do from below Fn? 

if __name__ == "__main__": 
root = MyApp() 
root.mainloop() 
+0

你能提供的“命令。文本'?没有这个,我无法测试你的代码。我试图删除它,但我只看到蓝色背景不是我的JPG图像 – CoppolaEmilio 2013-12-24 16:14:34

回答

2

这可以使用混合函数来实现。

Image.blend(image1, image2, alpha) ⇒ image 

由给定的图像之间进行内插,使用恒定的α创建一个新的图像。这两个图像必须具有相同的大小和模式。

out = image1 * (1.0 - alpha) + image2 * alpha 

如果alpha为0.0,则返回第一个图像的副本。如果alpha为1.0,则返回第二个图像的副本。 Alpha值没有限制。如有必要,结果将被剪裁以适合允许的输出范围。

所以,你可以有这样的事情:

alpha = 0 
while 1.0 > alpha: 
    image.blend(img1,img2,alpha) 
    alpha = alpha + 0.01 
    label_image.update() 

一个例子是在这里,没有带过的时间来测试这一点,但你得到的idea-

from PIL import image 
import time 
white = image.open("white_248x.jpg") 
black = image.open("black_248x.jpg") 
new_img = image.open("white_248x.jpg") 
root = Tk() 
image_label = label(root, image=new_img) 
image_label.pack() 
alpha = 0 
while 1.0 > alpha: 
    new_img = image.blend(white,black,alpha) 
    alpha = alpha + 0.01 
    time.sleep(0.1) 
    image_label.update() 
root.mainloop() 
+0

谢谢 - 这是在一个非常及时的时刻:-)你有一个脚本这样做的例子吗? – Staple 2014-06-17 21:27:17

+0

这是在底部的原始问题 - 我已编辑它:) – 2014-06-18 22:10:34