Ich möchte Drag&Drop in wxPython implementieren, die in ähnlicher Weise wie in WordPad/Eclipse etc. funktioniert. Ich meine das Folgende:
Wenn etwas in WordPad eingefügt wird, befindet sich das WordPad-Fenster im Vordergrund und der Text wird hinzugefügt. Im Eclipse-Editor wird der Text eingefügt, das Eclipse-Fenster erhält den Fokus und befindet sich im Vordergrund.
Wenn ich Drag&Drop mit wxPython implementiere, wird das Zielfenster nicht in den Vordergrund gebracht. Ich habe Drag&Drop auf ähnliche Weise implementiert wie (drag):
import wx
class DragFrame(wx.Frame):
def __init__(self):
wx.Frame.__init__(self, None)
self.tree = wx.TreeCtrl(self, wx.ID_ANY)
root = self.tree.AddRoot("root item")
self.tree.AppendItem(root, "child 1")
self.tree.Bind(wx.EVT_TREE_BEGIN_DRAG, self.__onBeginDrag)
def __onBeginDrag(self, event):
tdo = wx.PyTextDataObject(self.tree.GetItemText(event.GetItem()))
dropSource = wx.DropSource(self.tree)
dropSource.SetData(tdo)
dropSource.DoDragDrop(True)
app = wx.PySimpleApp()
frame = DragFrame()
app.SetTopWindow(frame)
frame.Show()
app.MainLoop()
Zweites Programm (Drop):
import wx
class TextDropTarget(wx.TextDropTarget):
def __init__(self, obj):
wx.TextDropTarget.__init__(self)
self.obj = obj
def OnDropText(self, x, y, data):
self.obj.WriteText(data + '\n\n')
wx.MessageBox("Error", "Error", style = wx.ICON_ERROR)
class DropFrame(wx.Frame):
def __init__(self):
wx.Frame.__init__(self, None)
text = wx.TextCtrl(self, wx.ID_ANY)
text.SetDropTarget(TextDropTarget(text))
app = wx.PySimpleApp()
frame = DropFrame()
app.SetTopWindow(frame)
frame.Show()
app.MainLoop()
Wenn Sie beide Programme ausführen, platzieren Sie Windows in der Mitte des Bildschirms (ein Teil des Ablagefensters ist sichtbar), dann ziehen Sie einen Knoten vom Ablagefenster zum Ablagefenster - im Zielfenster wird ein nicht sichtbares Meldungsfenster angezeigt, das Zielfenster ist hinter dem Quellfenster verborgen.
Wie implementiert man Drag&Drop, das den Fokus auf das zweite (Ziel-)Fenster legt? Ich habe versucht, window.Show(), window.SetFocus() hinzuzufügen und sogar einige Funktionen der WinAPI (über win32gui) zu verwenden. Ich denke, es sollte einen Standardweg geben, dies zu tun. Was übersehe ich?