Я хотел бы реализовать перетаскивание в wxPython, которое работает аналогично WordPad / Eclipse и т. Д. Я имею в виду следующее:
когда что-то перетаскивается в WordPad, окно WordPad находится сверху с фокусом, а текст добавляется. В редакторе Eclipse текст вставлен, окно Eclipse получает фокус и находится сверху.
Когда я реализую перетаскивание с использованием wxPython, целевое окно не выводится на передний план. Я реализовал перетаскивание аналогично (перетаскиванию):
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()
Вторая программа (капля):
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()
При запуске обеих программ разместите окна в центре экрана (часть выпадающего окна видна), затем перетащите узел из окна перетаскивания в окно падения - в целевом окне отображается окно сообщения, которое не отображается, целевое окно скрыто за исходное окно.
Как реализовать перетаскивание, которое будет фокусироваться на втором (целевом) окне? Я пробовал добавлять window.Show (), window.SetFocus (), даже используя некоторые функции WinAPI (через win32gui). Я думаю, что должен быть какой-то стандартный способ сделать это. Что мне не хватает?