2015-08-21 38 views
0

新建覆盆子PI /蟒蛇,並試圖修改一些代碼外部觸發:爲更改爲下一個圖像

我有以下並希望使用一個外部觸發切換到下一個圖像。

#!/usr/bin/env python 
from Tkinter import * 
import Image, ImageTk 
import os, sys 
import RPi.GPIO as GPIO 

class Viewer: 
    def __init__(self, master, filelist): 
     GPIO.setmode(GPIO.bin) 
     GPIO.setup(23, GPIO.IN, pull_up_down=GPIO.PUD.UP) 
     GPIO.add_event_detect(23, GPIO.FALLING) 
     self.top = master 
     self.files = filelist 
     self.index = 0 
     #display first image 
     filename = filelist[0] 
     if not os.path.exists(filename): 
      print "Unable to find %s" % filename 
      self.top.quit() 

    self.title = Label(text=os.path.basename(filename)) 
    self.title.pack() 

    im = Image.open(filename) 
    if im.format == "SPIDER": 
     im = im.convert2byte() 
    self.size = im.size 
    self.tkimage = ImageTk.PhotoImage(im, palette=256) 

    self.lbl = Label(master, image=self.tkimage) 
    self.lbl.pack(side='top') 

    # the button frame 
    fr = Frame(master) 
    fr.pack(side='top', expand=1, fill='x') 
    back = Button(fr, text="back", command=lambda : self.nextframe(-1)) 
    back.grid(row=0, column=0, sticky="w", padx=4, pady=4) 

    ilabel = Label(fr, text="image number:") 
    ilabel.grid(row=0, column=1, sticky="e", pady=4) 

    self.evar = IntVar() 
    self.evar.set(1) 
    entry = Entry(fr, textvariable=self.evar) 
    entry.grid(row=0, column=2, sticky="w", pady=4) 
    entry.bind('<Return>', self.getimgnum) 

    next = Button(fr, text="next", command=lambda : self.nextframe(1)) 
    next.grid(row=0, column=3, sticky="e", padx=4, pady=4) 

# image doesn't appear unless put Image.open in separate function? 
# and need to use tkimage.paste, not ImageTk.PhotoImage 
def getImage(self, filename): 
    im = Image.open(filename) 
    if im.format == "SPIDER": 
     im = im.convert2byte() 
    if im.size != self.size: 
     print "all images must be same dimensions:" 
     f1 = os.path.basename(self.files[0]) 
     f2 = os.path.basename(filename) 
     print "%s: %s, %s : %s" % (f1, str(self.size),f2, str(im.size)) 
     self.top.quit() 
    return im 

def nextframe(self,i=1, imgnum=-1): 
    if imgnum == -1: 
     self.index += i 
    else: 
     self.index = imgnum - 1 
    if self.index >= len(self.files): 
     self.index = 0 
    elif self.index < 0: 
     self.index = len(self.files) - 1 
    filename = self.files[self.index] 
    if not os.path.exists(filename): 
     print "Unable to find %s" % filename 
     self.top.quit() 
    self.title.configure(text=os.path.basename(filename)) 
    self.evar.set(self.index+1) 

    im = self.getImage(filename) 
    self.tkimage.paste(im) 

def getimgnum(self, event=None): 
    self.nextframe(imgnum=self.evar.get()) 


if __name__ == "__main__": 

    if not sys.argv[1:]: 
     print "Usage: viewseries.py images*" 
     sys.exit() 
filelist = sys.argv[1:] 

root = Tk() 
app = Viewer(root, filelist) 
root.mainloop() 

------------------------------------------- ----------------------------

這裏是代碼的簡單版本:

import Tkinter 
import Image 
import ImageTk 
import Rpi.GPIO as GPIO 

GPIO.setmode(GPIO.BCM) 
GPIO.setup(23, GPIO.IN, pull_up_down=GPIO.PUD_UP) 


trig =1 

def ChangeImage(): 
    global tkpi 
    global trig 
    trig = trig + 1 
    image = Image.open("home/pi/Desktop/" + str(trig) + ".gif") 
    tkpi = ImageTk.PhotoImage(image) 
    label_image = Tkinter.Label (root, image=tkpi) 
    root.bind(GPIO.wait_for_edge(23, GPIO.FALLING), changeImage) 
    root.attributes("-fullscreen", True) 
    #root.after(500, changeImage) 

tkpi = None 
root = Tkinter.Tk() 
changeImage() 
root.mainloop() 
+0

什麼是不工作? – Mischback

+0

先修正縮進。 – nbro

+0

固定縮進。我只是不知道如何用引腳23上的GPIO替換下一個按鈕我有一個簡單的代碼版本,因爲我需要做的就是在外部觸發器上顯示系列中的下一個圖像。外部觸發器將加載第一個圖像,而不是下一個。我在網上發現了這個例子,但它比我的原始代碼更復雜,並且在插入中斷時遇到了問題。一旦外部觸發器上的圖像發生變化,我將刪除多餘的代碼 – JRJR

回答

0

我它工作。

import Tkinter 
import Image 
import ImageTk 
import Rpi.GPIO as GPIO 

GPIO.setmode(GPIO.BCM) 
GPIO.setup(23, GPIO.IN, pull_up_down=GPIO.PUD_UP) 


trig =1 

def ChangeImage(self): 
    global tkpi 
    global trig 
    trig = trig + 1 
    image = Image.open("home/pi/Desktop/" + str(trig) + ".gif") 
    tkpi = ImageTk.PhotoImage(image) 
    label_image = Tkinter.Label (root, image=tkpi) 
    root.bind(GPIO.add_event_detect(23, GPIO.FALLING callback=changeImage) 
    root.attributes("-fullscreen", True) 
    #root.after(500, changeImage) 

tkpi = None 
root = Tkinter.Tk() 
changeImage(None) 
root.mainloop() 
+0

該死的我太遲了: –

0

我從學校的RPI東西一知半解,當我們用按鈕製作GertBoard(擴展板,用於RB帶LED按鈕等),我們使用add事件檢測

import Tkinter 
import Image 
import ImageTk 
import Rpi.GPIO as GPIO 

GPIO.setmode(GPIO.BCM) 
GPIO.setup(23, GPIO.IN, pull_up_down=GPIO.PUD_UP) 
GPIO.add_event_detect(23, GPIO.FALLING) 


trig = 0 #are you sure you dont want this 0 
     #first since you increment it before adressing the image number 
     #keep it in mind 
     #unless picture numbering starts with 2 

def ChangeImage(): 
    global tkpi 
    global trig 
    trig = trig + 1 #if you set the initial value to one below this line it will be 2 for the first time. Keep it in mind 
    image = Image.open("home/pi/Desktop/" + str(trig) + ".gif") 
    tkpi = ImageTk.PhotoImage(image) 
    label_image = Tkinter.Label (root, image=tkpi) 
    root.attributes("-fullscreen", True) 

    GPIO.add_event_callback(23, ChangeImage) 


tkpi = None #I'm quite sure this is not needed since you overwrite it when needed 
root = Tkinter.Tk() 
changeImage() 
root.mainloop() 

我們從這裏與信息合作: http://sourceforge.net/p/raspberry-gpio-python/wiki/Inputs/