2016-07-01 3 views
1

Я нашел этот аккуратный код here, который использует Tkinter для отображения серии изображений. Я расширил код, чтобы использовать клавиши «z» и «x» для просмотра изображений и «q» для выхода. Кроме того, я хотел бы иметь возможность нажимать на отдельные кадры и получать координаты изображения, где я нажал. В то время как взаимодействие с клавиатурой работает нормально, событие щелчка мыши не запускается. Интересно, почему это так, так как ключевые штрихи срабатывают просто отлично.Событие Tkinter click не запускается; клавиатура

Это код, у меня есть:

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

class Clicker: 
    def __init__(self, master, filelist): 
     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) 
     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='both') 
     back = Button(fr, text="back", command=lambda : self.nextframe(-1)) 
     back.grid(row=0, column=0, sticky="w", padx=4, pady=4) 

     self.ilabel = Label(fr, text="image number: %d/%d" % 
          (self.index+1, len(self.files))) 
     self.ilabel.grid(row=0, column=1, sticky="e", pady=4) 

     self.evar = IntVar() 
     self.evar.set(1) 

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

     # events 
     fr.focus_set() 
     fr.bind("<Key>", self.key) 
     fr.bind("<Button 1>", self.left_click) 


    def left_click(self, event): 
     print (event.x,event.y) 


    def key(self, event): 
     if event.char == 'z': 
      # previous frame 
      self.nextframe(-1) 
     elif event.char == 'x': 
      # next frame 
      self.nextframe(1) 
     elif event.char == 'q': 
      # quit 
      self.top.quit() 

    def getImage(self, filename): 
     im = Image.open(filename) 
     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) 

     self.ilabel.configure(text="image number: %d/%d" % 
           (self.index+1, len(self.files))) 

     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: click.py images*" 
     sys.exit() 
    filelist = sys.argv[1:] 

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

Код должен работать с любым набором изображений, все из которых должны иметь одинаковые размеры.

Редактировать: Интересно, что я могу получить позицию курсора по ключевому штриху, но не по щелчку мыши.

ответ

0

Похоже, я нашел ответ сам:

Если я заменю Frame с Canvas, я могу вызвать событие мыши. Я не уверен, почему так, но это работает.

Смежные вопросы