When dclick image, I want to get "OnMouseLeftDClick ======" message.
But I always get "image on left dclick ------" message.
Please help me.
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# When dclick image, I want to get "OnMouseLeftDClick ======" message.
import wx
import os
import sys
reload(sys)
sys.setdefaultencoding("utf-8")
image_file = "Waterlilies.jpg"
BAD_IMAGE = -1
class ImageView(wx.Window):
def __init__(self, parent, id=-1, pos=wx.DefaultPosition,
size=wx.DefaultSize,
style=wx.BORDER_SUNKEN
):
wx.Window.__init__(self, parent, id, (0, 0), (-1, 300), style=style)
self.maxWidth = 0
self.maxHeight = 0
self.image = None
self.dark_bg = None
self.lite_bg = None
self.Bind(wx.EVT_LEFT_UP, self.OnMouseLeftUp)
self.Bind(wx.EVT_LEFT_DCLICK, self.OnMouseLeftDClick)
self.Bind(wx.EVT_SIZE, self.OnSize)
self.Bind(wx.EVT_PAINT, self.OnPaint)
def OnEnterWindow(self, event):
print "On Enter Window -------"
def OnLeaveWindow(self, event):
print "On Leave Window -------"
def OnKeyUp(self, event):
key = event.GetKeyCode()
print "on key up ------: ", key
Level = event.StopPropagation()
if (Level == 0):
Level = 1
event.ResumePropagation(Level)
event.Skip()
def OnMouseLeftUp(self, event):
print "image on left up ------"
Level = event.StopPropagation()
if (Level == 0):
Level = 1
event.ResumePropagation(Level)
event.Skip()
def OnMouseLeftDClick(self, event):
print "image on left dclick ------"
Level = event.StopPropagation()
if (Level == 0):
Level = 1
event.ResumePropagation(Level)
event.Skip()
def SetValue(self, filename, rotate, enlarge):
if (filename):
self.image = wx.Image(filename, wx.BITMAP_TYPE_ANY)
else:
print "no file, try to clear"
self.image = None
self.famous_words == " "
self.Refresh()
def SetImageObject(self, image_object):
if image_object:
self.image = image_object
self.Refresh()
def SetZoomValue(self, value):
self.zoom_value = value
if self.maxWidth == 0:
self.maxWidth, self.maxHeight = self.GetSize()
self.maxWidth = int(self.maxWidth * self.zoom_value)
self.maxHeight = int(self.maxHeight * self.zoom_value)
self.SetVirtualSize((self.maxWidth, self.maxHeight))
self.SetScrollRate(20,20)
def SetBackgroundMode(self, mode):
self.bg_mode = mode
self._updateBGInfo()
def _updateBGInfo(self):
bg = self.bg_mode
border = self.border_mode
self.dark_bg = None
self.lite_bg = None
if border == ID_BOX_FRAME:
self.lite_bg = wx.BLACK_PEN
if bg == ID_WHITE_BG:
if border == ID_CROP_FRAME:
self.SetBackgroundColour('LIGHT GREY')
self.lite_bg = wx.WHITE_BRUSH
else:
self.SetBackgroundColour('WHITE')
elif bg == ID_GREY_BG:
if border == ID_CROP_FRAME:
self.SetBackgroundColour('GREY')
self.lite_bg = wx.LIGHT_GREY_BRUSH
else:
self.SetBackgroundColour('LIGHT GREY')
elif bg == ID_BLACK_BG:
if border == ID_BOX_FRAME:
self.lite_bg = wx.WHITE_PEN
if border == ID_CROP_FRAME:
self.SetBackgroundColour('GREY')
self.lite_bg = wx.BLACK_BRUSH
else:
self.SetBackgroundColour('BLACK')
else:
if self.check_bmp is None:
self.check_bmp = GetCheckeredBitmap()
self.check_dim_bmp = GetCheckeredBitmap(rgb0='\x7F',
rgb1='\x66')
if border == ID_CROP_FRAME:
self.dark_bg = self.check_dim_bmp
self.lite_bg = self.check_bmp
else:
self.dark_bg = self.check_bmp
self.Refresh()
def SetBorderMode(self, mode):
self.border_mode = mode
self._updateBGInfo()
def OnSize(self, event):
event.Skip()
self.Refresh()
def OnPaint(self, event):
dc = wx.PaintDC(self)
self.DrawImage(dc)
def OnEraseBackground(self, evt):
if self.bg_mode != ID_CHECK_BG:
evt.Skip()
return
dc = evt.GetDC()
if not dc:
dc = wx.ClientDC(self)
rect = self.GetUpdateRegion().GetBox()
dc.SetClippingRect(rect)
self.PaintBackground(dc, self.dark_bg)
def PaintBackground(self, dc, painter, rect=None):
if painter is None:
return
if rect is None:
pos = self.GetPosition()
sz = self.GetSize()
else:
pos = rect.Position
sz = rect.Size
if type(painter)==wx.Brush:
dc.SetPen(wx.TRANSPARENT_PEN)
dc.SetBrush(painter)
dc.DrawRectangle(pos.x,pos.y,sz.width,sz.height)
elif type(painter)==wx.Pen:
dc.SetPen(painter)
dc.SetBrush(wx.TRANSPARENT_BRUSH)
dc.DrawRectangle(pos.x-1,pos.y-1,sz.width+2,sz.height+2)
else:
self.TileBackground(dc, painter, pos.x,pos.y,sz.width,sz.height)
def TileBackground(self, dc, bmp, x,y,w,h):
"""Tile bmp into the specified rectangle"""
bw = bmp.GetWidth()
bh = bmp.GetHeight()
dc.SetClippingRegion(x,y,w,h)
dx = x % bw
x = x - dx
w = w + dx
dy = y % bh
y = y - dy
h = h + dy
tx = x
x2 = x+w
y2 = y+h
while tx < x2:
ty = y
while ty < y2:
dc.DrawBitmap(bmp, tx, ty)
ty += bh
tx += bw
def DrawImage(self, dc):
"""must use one type image, pil or wx.image"""
wwidth,wheight = self.GetSize()
if self.maxWidth > 0:
wwidth = self.maxWidth
wheight = self.maxHeight
image = self.image
bmp = None
iwidth = image.GetWidth() # dimensions of image file
iheight = image.GetHeight()
xfactor = float(wwidth) / iwidth
yfactor = float(wheight) / iheight
self.image_scale = 0
if self.image_scale == 0:
if xfactor < 1.0 and xfactor < yfactor:
self.image_scale = xfactor
elif yfactor < 1.0 and yfactor < xfactor:
self.image_scale = yfactor
else:
self.image_scale = 1.0
else:
if self.zoom_value > 0:
self.image_scale *= self.zoom_value
owidth = int(self.image_scale*iwidth)
oheight = int(self.image_scale*iheight)
diffx = (wwidth - owidth)/2 # center calc
diffy = (wheight - oheight)/2 # center calc
if not bmp:
if owidth!=iwidth or oheight!=iheight:
sc_image = sc_image = image.Scale(owidth,oheight)
else:
sc_image = image
bmp = sc_image.ConvertToBitmap()
if image != BAD_IMAGE and image.IsOk():
self.PaintBackground(dc, self.lite_bg,
wx.Rect(diffx,diffy,owidth,oheight))
dc.DrawBitmap(bmp, diffx, diffy, useMask=True) # draw
the image to window
class ImagePanel(wx.Panel):
def __init__(self, parent, id=-1, pos=wx.DefaultPosition,
size=wx.DefaultSize, style=wx.NO_BORDER ):
wx.Panel.__init__(self, parent, id, pos, size, style=style)
self.bs = wx.BoxSizer(wx.VERTICAL)
self.view = ImageView(self)
self.bs.Add(self.view, 1, wx.EXPAND)
self.SetSizer(self.bs)
def SetValue(self, filename, rotate=0, enlarge=1): # display
the selected file in the panel
self.view.SetValue(filename, rotate, enlarge)
def SetImageObject(self, image_object): # display the selected
file in the panel
self.view.SetImageObject(image_object)
def SetZoomValue(self, value):
self.view.SetZoomValue(value)
class Frame(wx.Frame):
"""Frame class, main window."""
def __init__(self):
wx.Frame.__init__(self, None, -1, "Image Change", size=(800, 600))
self.panel = wx.Panel(self)
self.filename = None
self.listbox_curr_item = -1
self.tmp_mark = True
label_format = wx.StaticText(self.panel, -1, "Format", size=(60, -1))
list_close = wx.Button(self.panel, -1, label="Close")
self.listbox = wx.ListBox(self.panel, -1, (20, 20), (150,
460), "", wx.LB_EXTENDED)
vbox_top = wx.BoxSizer(wx.HORIZONTAL)
self.image_view = ImagePanel(self.panel)
vbox_left = wx.BoxSizer(wx.VERTICAL)
vbox_change_format = wx.BoxSizer(wx.HORIZONTAL)
vbox_change_format.Add(label_format, 0, flag=wx.ALIGN_CENTER)
vbox_left.Add(self.image_view, 1, wx.EXPAND)
vbox_top.Add(vbox_left, 1, wx.EXPAND)
vbox_cmd = wx.BoxSizer(wx.VERTICAL)
vbox_listbox = wx.BoxSizer(wx.VERTICAL)
vbox_cmd.Add(list_close, 0, wx.ALIGN_CENTER)
vbox_listbox.Add(self.listbox, 0, wx.ALL|wx.EXPAND, border=1)
vbox_cmd_listbox = wx.BoxSizer(wx.HORIZONTAL)
vbox_cmd_listbox.Add(vbox_cmd, 0, flag=wx.ALIGN_CENTER)
vbox_cmd_listbox.Add(vbox_listbox, 0, flag=wx.ALIGN_CENTER)
vbox_format = wx.BoxSizer(wx.HORIZONTAL)
vbox_format.Add(label_format, 0, flag=wx.ALIGN_CENTER)
vbox_right = wx.BoxSizer(wx.VERTICAL)
vbox_right.Add(vbox_cmd_listbox, 0, flag=wx.ALIGN_CENTER)
vbox_top.Add(vbox_right, 0, flag=wx.ALL|wx.EXPAND, border=2)
self.panel.SetSizer(vbox_top)
self.Bind(wx.EVT_LEFT_UP, self.OnMouseLeftUp)
self.Bind(wx.EVT_LEFT_DCLICK, self.OnMouseLeftDClick)
self.Bind(wx.EVT_BUTTON, self.OnClose, list_close)
self.Bind(wx.EVT_CLOSE, self.OnExit)
self.Bind(wx.EVT_ENTER_WINDOW, self.OnEnterWindow)
self.image_view.SetValue(image_file)
def OnMouseLeftUp(self, event):
print "on left up ======"
def OnMouseLeftDClick(self, event):
print "OnMouseLeftDClick ======"
def OnEnterButton(self, event):
"""Move mouse into the button area."""
print "enter button"
event.Skip()
def OnLeaveButton(self, event):
print "button leave"
event.Skip()
def OnEnterWindow(self, event):
print "OnEnterWindow"
def OnSize(self, event):
print "main frame OnSize"
def OnExit(self, event):
self.Destroy()
event.Skip()
class App(wx.App):
"""Application class."""
def OnInit(self):
self.frame = Frame()
self.frame.Show(True)
self.SetTopWindow(self.frame)
return True
def main():
app = App()
app.MainLoop()
if __name__ == '__main__':
main()
debug_event.py (10.7 KB)
···
--
jiang zhixiang