wxPython中的形状拖放

yc0p9oo0  于 2023-03-06  发布在  Python
关注(0)|答案(2)|浏览(83)

bounty将在7小时后过期。回答此问题可获得+300的声誉奖励。Swatcat正在寻找来自声誉良好来源的答案

我正在尝试使用wxPython Phoenix在Python中创建一个拖放应用程序(就像虚幻引擎处理事件的方式一样-例如here)。
我已经找到了这个Stack Overflow question,我已经弄清楚了如何适应它,使它画一个矩形,但我不知道如何有连接器节点和画线之间的矩形。
任何人都可以链接我一个很好的教程或演示程序请(这将是非常感谢)作为一个起点。

dnph8jn4

dnph8jn42#

当然,这里有一个例子,说明如何在wxPython中创建一个拖放应用程序,在形状之间使用连接器和线条:

import wx

class Shape:
    def __init__(self, x, y, width, height, color):
        self.x = x
        self.y = y
        self.width = width
        self.height = height
        self.color = color

class Connector:
    def __init__(self, start, end):
        self.start = start
        self.end = end

class MyFrame(wx.Frame):
    def __init__(self):
        super().__init__(None, title="Drag and Drop Shapes")

        self.shapes = []
        self.connectors = []
        self.selected_shape = None
        self.dragging = False
        self.offset = (0, 0)

        self.Bind(wx.EVT_PAINT, self.on_paint)
        self.Bind(wx.EVT_LEFT_DOWN, self.on_left_down)
        self.Bind(wx.EVT_LEFT_UP, self.on_left_up)
        self.Bind(wx.EVT_MOTION, self.on_motion)

    def on_paint(self, event):
        dc = wx.PaintDC(self)

        for shape in self.shapes:
            dc.SetPen(wx.Pen(shape.color))
            dc.SetBrush(wx.Brush(shape.color))
            dc.DrawRectangle(shape.x, shape.y, shape.width, shape.height)

        for connector in self.connectors:
            start = (connector.start.x + connector.start.width // 2, connector.start.y + connector.start.height)
            end = (connector.end.x + connector.end.width // 2, connector.end.y)
            dc.DrawLine(start[0], start[1], end[0], end[1])

    def on_left_down(self, event):
        x, y = event.GetPosition()

        for shape in self.shapes:
            if x >= shape.x and x <= shape.x + shape.width and y >= shape.y and y <= shape.y + shape.height:
                self.selected_shape = shape
                self.dragging = True
                self.offset = (x - shape.x, y - shape.y)
                break

    def on_left_up(self, event):
        if self.dragging:
            self.dragging = False

    def on_motion(self, event):
        if self.dragging:
            x, y = event.GetPosition()
            self.selected_shape.x = x - self.offset[0]
            self.selected_shape.y = y - self.offset[1]
            self.Refresh()

    def add_shape(self, shape):
        self.shapes.append(shape)
        self.Refresh()

    def add_connector(self, connector):
        self.connectors.append(connector)
        self.Refresh()

class MyApp(wx.App):
    def OnInit(self):
        frame = MyFrame()
        frame.Show()
        return True

if __name__ == '__main__':
    app = MyApp()
    app.MainLoop()

Shape和Connector是表示形状和连接器的两个类。MyFrame类是应用程序的主框架。它有一个形状和连接器的列表,一个用于跟踪当前所选形状的selected_shape变量,一个用于指示用户是否正在拖动形状的拖动标志,和跟踪鼠标光标与所选形状的左上角之间的偏移的偏移变量。
on_paint方法负责绘制屏幕上的形状和连接器,它使用wx.PaintDC类绘制颜色和大小正确的形状,并使用DrawLine方法绘制形状之间的连接器。
on_left_down、on_left_up和on_motion方法处理鼠标

相关问题