2016-07-01 4 views
1

このきれいなコードhereは、一連の画像を表示するためにTkinterを使用しています。私は 'z'と 'x'キーを使って画像をブラウズし、 'q'を使って終了するようにコードを拡張しました。また、個々のフレームをクリックして、クリックした場所の画像座標を取得したいと考えています。キーボードのやりとりはうまく動作しますが、マウスクリックイベントはトリガされません。キーストロークがちょうどいいから始まるので、私はそれがなぜあるのだろうと思います。Tkinterクリックイベントがトリガされません。 keyboard does

これは私が持っているコードである。

#!/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

私は答えを自分で見つけように思える:

私はCanvasFrameを交換した場合、私はマウスクリックイベントをトリガすることができています。なぜそれが当てはまるのか分かりませんが、うまくいきます。

関連する問題