FloatCanvas image

How to crop the rectangles in the image when adding them, I am using FloatCanvas.

import wx

import wx.aui

from wx.lib.floatcanvas import NavCanvas,FloatCanvas,GUIMode

from src.utils.shape import Shape

from src.utils.NavCanvasCustom import NavCanvasCustom

from wx.lib.floatcanvas.Utilities import GUI

from PIL import Image

class App(wx.Frame):

def __init__(self):

    super().__init__(None, title="Sistema VSIA", size=(1300, 800))

    self.mgr = wx.aui.AuiManager(self)

    self.Maximize()

    self.SetMinSize((1300, 800))

    # ------------------------------------------------

    self.toolbar = self.CreateToolBar()

    self.toolbar.AddTool(wx.ID_NEW, "Novo", wx.ArtProvider.GetBitmap(wx.ART_NEW, wx.ART_TOOLBAR, (25, 25)))

    self.toolbar.AddTool(wx.ID_SAVE, "Salvar", wx.ArtProvider.GetBitmap(wx.ART_FILE_SAVE, wx.ART_TOOLBAR, (25, 25)))

    self.toolbar.AddSeparator()

    self.toolbar.AddTool(wx.ID_EXIT, "Sair", wx.ArtProvider.GetBitmap(wx.ART_ERROR, wx.ART_TOOLBAR, (25, 25)))

    self.toolbar.Realize()

    #----------------------------

    self.canvas = NavCanvasCustom(self,

                                  height=1500,

                                  width=1500,

                                  color="white")

   

    self.Rects: list[FloatCanvas.Rectangle] = []

    self.RBBoxMode = GUI.RubberBandBox(self.NewRect)

    self.canvas.Canvas.SetMode(self.RBBoxMode)

    tb = self.canvas.ToolBar

    tb.AddSeparator()

    ClearButton = wx.Button(tb, wx.ID_ANY, "Clear")

    tb.AddControl(ClearButton)

    ClearButton.Bind(wx.EVT_BUTTON, self.Clear)

    DrawButton = wx.Button(tb, wx.ID_ANY, "StopDrawing")

    tb.AddControl(DrawButton)

    DrawButton.Bind(wx.EVT_BUTTON, self.SetDraw)

    self.DrawButton = DrawButton

    printE = wx.Button(tb, wx.ID_ANY, "Logs")

    tb.AddControl(printE)

    printE.Bind(wx.EVT_BUTTON, self.Logs)

    tb.Realize()

    self.canvas.Canvas.ZoomToBB()

    self.mgr.AddPane(self.canvas, wx.aui.AuiPaneInfo().CenterPane().Caption("Painel de Imagem"))

    #------------------------------

    left_panel = wx.Panel(self)

    left_sizer = wx.BoxSizer(wx.VERTICAL)

    self.tree = wx.TreeCtrl(left_panel, style=wx.TR_DEFAULT_STYLE)

    self.il = wx.ImageList(16, 16)

    self.folder_icon = self.il.Add(wx.ArtProvider.GetBitmap(wx.ART_WX_LOGO, wx.ART_OTHER, (16, 16)))

    self.file_icon = self.il.Add(wx.ArtProvider.GetBitmap(wx.ART_ADD_BOOKMARK, wx.ART_OTHER, (16, 16)))

    self.file_icon_t = self.il.Add(wx.ArtProvider.GetBitmap(wx.ART_EXECUTABLE_FILE, wx.ART_OTHER, (16, 16)))

    self.tree.AssignImageList(self.il)

    root = self.tree.AddRoot("Programa", self.folder_icon)

    self.tree.SetItemData(root, 0)  # ID = 0

    item1 = self.tree.AppendItem(root, "Nova IA", self.file_icon_t)

    self.tree.SetItemData(item1, 1)  # ID = 1

    item2 = self.tree.AppendItem(root, "Configuração de modelo", self.file_icon)

    self.tree.SetItemData(item2, 2)  # ID = 2

    child = self.tree.AppendItem(root, "Geometrias", self.folder_icon)

    self.tree.SetItemData(child, 3)  # ID = 3

    item3 = self.tree.AppendItem(child, "Retangulo", self.file_icon)

    self.tree.SetItemData(item3, 4)  # ID = 4

    item4 = self.tree.AppendItem(child, "Circulo", self.file_icon)

    self.tree.SetItemData(item4, 5)  # ID = 5

    child2 = self.tree.AppendItem(root, "Cores", self.folder_icon)

    self.tree.SetItemData(child2, 6)  # ID = 6

    item5 = self.tree.AppendItem(child2, "Criar programa", self.file_icon)

    self.tree.SetItemData(item5, 7)  # ID = 7

    item6 = self.tree.AppendItem(child2, "Ajuste de posição", self.file_icon)

    self.tree.SetItemData(item6, 8)  # ID = 8

    self.tree.Expand(root)

    self.tree.Expand(child)

    self.tree.Expand(child2)

    left_sizer.Add(self.tree, 1, wx.EXPAND | wx.ALL, 5)

    left_panel.SetSizer(left_sizer)

    self.mgr.AddPane(left_panel, wx.aui.AuiPaneInfo().Left().Caption("Ferramentas").BestSize((300, -1)))

    # ----------------------------------------

    task_panel = wx.Panel(self)

    task_sizer = wx.BoxSizer(wx.VERTICAL)

    task_sizer.Add(wx.Button(task_panel, label="Programa"), 0, wx.ALL, 5)

    task_sizer.Add(wx.Button(task_panel, label="Programa"), 0, wx.ALL, 5)

    task_panel.SetSizer(task_sizer)

    self.mgr.AddPane(task_panel, wx.aui.AuiPaneInfo().Left().Caption("Painel de Ajustes").BestSize((300, -1)))

    #----------------------------------------

    notebook = wx.aui.AuiNotebook(self)

    notebook.AddPage(wx.TextCtrl(notebook), "Logs")

    self.mgr.AddPane(notebook, wx.aui.AuiPaneInfo().Bottom().Caption("Logs de sistema").PaneBorder(True).BestSize((-1, 100)))

    self.mgr.Update()

    self.Bind(wx.EVT_TOOL, self.OnToolClick)

    self.Bind(wx.EVT_CLOSE, self.OnClose)

    self.tree.Bind(wx.EVT_TREE_SEL_CHANGED, self.OnTreeItemSelected)

    self.shapes = []

    self.Show()

def Logs(self, event:wx.CommandEvent):



    for i, rect in enumerate(self.Rects):

            bounding_box = rect.XY

            testaaa = rect.WH

            print(bounding_box)

            print(testaaa)

           

def SetDraw(self, event=None):

    label = self.DrawButton.GetLabel()

    if label == "Draw":

        self.DrawButton.SetLabel("StopDrawing")

        self.canvas.Canvas.SetMode(self.RBBoxMode)

    elif label == "StopDrawing":

        self.DrawButton.SetLabel("Draw")

        self.canvas.Canvas.SetMode(GUIMode.GUIMouse())

    else: # huh?

        pass

def Clear(self, event=None):

    self.Rects = []

    self.canvas.Canvas.ClearAll()

    self.canvas.Canvas.Draw()

def NewRect(self, rect):

    rect = FloatCanvas.Rectangle(*rect, LineWidth=2,LineColor="Green",InForeground=True)

    self.canvas.Canvas.AddObject(rect)

    self.Rects.append(rect)

    self.canvas.Canvas.Draw(Force=True)

def OnTreeItemSelected(self, event):

    item = event.GetItem()

    if item:

        item_text = self.tree.GetItemText(item)

        item_id = self.tree.GetItemData(item)

           

def OnToolClick(self, event):

    tool_id = event.GetId()

    if tool_id == wx.ID_NEW:

        self.OnNewImage()

    elif tool_id == wx.ID_EXIT:

        self.Close()

def OnNewImage(self):

    with wx.FileDialog(self, "Escolha uma imagem", wildcard="Image files (*.png;*.jpg;*.jpeg;*.bmp)|*.png;*.jpg;*.jpeg;*.bmp",

                       style=wx.FD_OPEN | wx.FD_FILE_MUST_EXIST) as fileDialog:

        if fileDialog.ShowModal() == wx.ID_OK:

            filepath = fileDialog.GetPath()

            print(filepath)

            self.LoadImage(filepath)

def LoadImage(self, filepath):



    self.image = wx.Image(filepath, wx.BITMAP_TYPE_ANY)

    bitmap = self.image.ConvertToBitmap()

    float_bitmap = FloatCanvas.ScaledBitmap(bitmap, (0, 0),Height=100,InForeground = True)  

    self.canvas.Canvas.AddObject(float_bitmap)

    self.canvas.Canvas.ZoomToBB()

    self.canvas.Canvas.Draw()

def OnClose(self, event):

    self.mgr.UnInit()

    self.Destroy()

if name == “main”:

app = wx.App(False)

App()

app.MainLoop()

Your code cannot be run because the following items are not provided:

from src.utils.shape import Shape

from src.utils.NavCanvasCustom import NavCanvasCustom

Also, when posting code, please put three backtick ` characters before the first line of the code and three more backtick characters after the last line of code. That will prevent the forum software from reformatting the code which can wreck the indentation and interpret double underscores as bold markup, etc.