Python Tkinter click事件不会触发;键盘可以

Python Tkinter click事件不会触发;键盘可以,python,tkinter,Python,Tkinter,我发现了这个使用Tkinter显示一系列图像的简洁代码。我扩展了代码,使用“z”和“x”键浏览图像,使用“q”键退出。此外,我希望能够单击各个帧,并获得单击位置的图像坐标。虽然键盘交互工作正常,但不会触发鼠标单击事件。我想知道为什么会这样,因为按键触发得很好 这是我的代码: #!/usr/bin/env python from Tkinter import * import Image, ImageTk import os, sys class Clicker: def __init_

我发现了这个使用Tkinter显示一系列图像的简洁代码。我扩展了代码,使用“z”和“x”键浏览图像,使用“q”键退出。此外,我希望能够单击各个帧,并获得单击位置的图像坐标。虽然键盘交互工作正常,但不会触发鼠标单击事件。我想知道为什么会这样,因为按键触发得很好

这是我的代码:

#!/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()
#/usr/bin/env python
从Tkinter进口*
导入图像
导入操作系统,系统
类点击器:
定义初始化(self、master、文件列表):
self.top=master
self.files=文件列表
self.index=0
#显示第一个图像
文件名=文件列表[0]
如果不存在os.path.exists(文件名):
打印“找不到%s”%filename
self.top.quit()
self.title=Label(text=os.path.basename(文件名))
self.title.pack()
im=Image.open(文件名)
self.tkimage=ImageTk.PhotoImage(im,调色板=256)
self.lbl=标签(主控,图像=self.tkimage)
self.lbl.pack(side='top')
#按钮框
fr=帧(主)
fr.pack(side='top',expand=1,fill='both')
后退=按钮(fr,text=“后退”,command=lambda:self.nextframe(-1))
back.grid(行=0,列=0,sticky=“w”,padx=4,pady=4)
self.ilabel=Label(fr,text=“图像编号:%d/%d”%
(self.index+1,len(self.files)))
self.ilabel.grid(行=0,列=1,sticky=“e”,pady=4)
self.evar=IntVar()
自评估装置(1)
next=按钮(fr,text=“next”,command=lambda:self.nextframe(1))
next.grid(行=0,列=3,sticky=“e”,padx=4,pady=4)
#事件
fr.focus_set()
fr.bind(“,self.key)
fr.bind(“,self.left_单击)
def左键单击(自身,事件):
打印(事件x、事件y)
def键(自身、事件):
如果event.char='z':
#前一帧
self.nextframe(-1)
elif event.char=='x':
#下一帧
self.nextframe(1)
elif event.char=='q':
#退出
self.top.quit()
def getImage(自身,文件名):
im=Image.open(文件名)
返回即时消息
def nextframe(self,i=1,imgnum=-1):
如果imgnum==-1:
自索引+=i
其他:
self.index=imgnum-1
如果self.index>=len(self.files):
self.index=0
elif自指数<0:
self.index=len(self.files)-1
filename=self.files[self.index]
如果不存在os.path.exists(文件名):
打印“找不到%s”%filename
self.top.quit()
self.title.configure(text=os.path.basename(文件名))
自评估集(自索引+1)
self.ilabel.configure(text=“图像编号:%d/%d”%
(self.index+1,len(self.files)))
im=self.getImage(文件名)
self.tkimage.paste(im)
def getimgnum(自身,事件=无):
self.nextframe(imgnum=self.evar.get())
# --------------------------------------------------------------------
如果名称=“\uuuuu main\uuuuuuuu”:
如果不是sys.argv[1:]:
打印“用法:单击.py图像*”
sys.exit()
filelist=sys.argv[1:]
root=Tk()
app=点击器(根目录,文件列表)
root.mainloop()
代码应该适用于任何一组图像,所有这些图像都必须具有相同的尺寸


编辑:有趣的是,我可以在按键上得到光标位置,但不是在鼠标点击上。

似乎我自己找到了答案:


如果我将
框架
替换为
画布
,我就能够触发鼠标单击事件。我不知道为什么会这样,但它是有效的。

似乎我自己找到了答案:

如果我将
框架
替换为
画布
,我就能够触发鼠标单击事件。我不知道为什么会这样,但它是有效的