Ich habe folgenes Problem:
Ich habe einen Raumplaner, auf dem man durch Drag & Drop die Rasterelemente durch vollgrafische Elemente belegen soll.
Nun meine Frage:
1. Wie krieg ich es hin, dass die Rasterelemente meine "gezogenen" Bitmaps annehmen? Mit leeren Bitmaps?
Bin da etwas ratlos.

Code: Alles auswählen
# coding=utf-8
import wx # wxPython
import os # OS-spezifische Funktionen
import cPickle
class DropTarget(wx.PyDropTarget):
def __init__(self, parent):
wx.PyDropTarget.__init__(self)
self.data = wx.CustomDataObject("DoodleLines")
self.SetDataObject(self.data)
def OnDrop(self, x, y):
return True
def OnData(self, x, y, d):
return d
class Room_draw(object):
#--------------------------------------
def __init__(self, room_name, size):
#-----------------------------------
self.name_room = room_name
self.size = size
self.pos = (0,0)
self.status = 0
def SetPosition(self, pos):
#-----------------------------------
self.pos = pos
#Zeichnen der Räume für die Belegung
def Draw_Room(self, dc):
#-----------------------------------
if self.status == 1:
actPen_o = dc.GetPen()
dc.SetPen(wx.Pen('black', 5, wx.SOLID))
dc.DrawRectangle(self.pos[0], self.pos[1], self.size[0], self.size[1])
dc.DrawText(self.name_room, self.pos[0], self.pos[1])
if self.status == 1:
dc.SetPen(actPen_o)
#Prüfen ob Raum ausgewählt
def HitTest(self, x_pos, y_pos):
#-----------------------------------
if x_pos > self.pos[0] and x_pos < (self.pos[0] + self.size[0]):
if y_pos > self.pos[1] and y_pos < (self.pos[1] + self.size[1]):
return True
return False
def Select_Room(self):
#-----------------------------------
self.status = 1
def DeSelect_Room(self):
#-----------------------------------
self.status = 0
class DropSource(wx.Window):
def __init__(self, parent_opl):
#-----------------------------------
wx.Window.__init__(self, parent_opl, size=(300,400), pos=(800,50))
self.Bind(wx.EVT_PAINT, self.OnPaint)
self.Bind(wx.EVT_SIZE, self.OnSize)
self.Bind(wx.EVT_LEFT_DOWN, self.OnLeftDown)
self.Bind(wx.EVT_LEFT_UP, self.OnLeftUp)
self.rooms_list = [Room_draw('W1', (90, 160)), Room_draw('W2', (90, 110))]
#Position der Räume festlegen
x_pos = 100
y_pos = 100
for room_each in self.rooms_list:
room_each.SetPosition((x_pos, y_pos))
x_pos = x_pos + 100
self.dragRoom_o = None
def OnPaint(self, event):
#-----------------------------------
dc = wx.PaintDC(self)
dc.SetPen(wx.Pen('black', 1, wx.SOLID))
font = wx.SystemSettings.GetFont(wx.SYS_DEFAULT_GUI_FONT)
dc.SetFont(font)
# alle Räume darstellen
for room_each in self.rooms_list:
room_each.Draw_Room(dc)
def OnSize(self, event):
#-----------------------------------
size = self.GetParent().GetClientSize()
self.SetSize(size)
def OnLeftDown(self, event):
#-----------------------------------
# wurde ein Rechteck getroffen ?
x_pos = event.GetX()
y_pos = event.GetY()
for room_each in self.rooms_list:
if room_each.HitTest(x_pos, y_pos):
room_each.Select_Room()
self.dragRoom_one = room_each
else:
room_each.DeSelect_Room()
linesdata = cPickle.dumps(room_each, 1)
bdata = wx.CustomDataObject("DoodleLines")
bdata.SetData(linesdata)
dropSource = wx.DropSource(self)
dropSource.SetData(bdata)
dropSource.DoDragDrop(wx.Drag_AllowMove)
# neu darstellen
self.Refresh()
def OnLeftUp(self, event):
#-----------------------------------
if self.dragRoom_one != None:
# Ziehen beenden
self.dragRoom_one = None
self.Refresh()
class W1(wx.Window):
def __init__(self, parent):
wx.Window.__init__(self, parent, pos=(0, 0), size=(90, 160), style=wx.SUNKEN_BORDER)
dt = DropTarget(self)
self.SetDropTarget(dt)