Python Tkinter click事件不会触发;键盘可以
我发现了这个使用Tkinter显示一系列图像的简洁代码。我扩展了代码,使用“z”和“x”键浏览图像,使用“q”键退出。此外,我希望能够单击各个帧,并获得单击位置的图像坐标。虽然键盘交互工作正常,但不会触发鼠标单击事件。我想知道为什么会这样,因为按键触发得很好 这是我的代码: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_
#!/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()
代码应该适用于任何一组图像,所有这些图像都必须具有相同的尺寸
编辑:有趣的是,我可以在按键上得到光标位置,但不是在鼠标点击上。似乎我自己找到了答案:
如果我将
框架
替换为画布
,我就能够触发鼠标单击事件。我不知道为什么会这样,但它是有效的。似乎我自己找到了答案:
如果我将框架
替换为画布
,我就能够触发鼠标单击事件。我不知道为什么会这样,但它是有效的