This topic needs a title

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)

Waterlilies.jpg

···

--
jiang zhixiang

yes
self.GetTopLevelParent() can fix this issue.

···

2014-03-27 23:53 GMT+08:00 Rill luckrill@gmail.com:

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](http://self.bs) = wx.BoxSizer(wx.VERTICAL)

    self.view = ImageView(self)

    self.bs.Add(self.view, 1, wx.EXPAND)

    self.SetSizer([self.bs](http://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()

jiang zhixiang

You received this message because you are subscribed to the Google Groups “wxPython-users” group.

To unsubscribe from this group and stop receiving emails from it, send an email to wxpython-users+unsubscribe@googlegroups.com.

For more options, visit https://groups.google.com/d/optout.


jiang zhixiang