wxpython проблема перетаскивания фокуса

Я хотел бы реализовать перетаскивание в 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). Я думаю, что должен быть какой-то стандартный способ сделать это. Что мне не хватает?


person uhz    schedule 22.09.2009    source источник


Ответы (2)


Вам нужно делать все, что вы хотите, int DragOver метод DropTarget, например. там вы можете поднять и установить фокус на вашем окне

образец рабочего кода для цели

import wx
class TextDropTarget(wx.TextDropTarget):
    def __init__(self, obj, callback):
        wx.TextDropTarget.__init__(self)
        self.obj = obj
        self._callback = callback

    def OnDropText(self, x, y, data):
        self.obj.WriteText(data + '\n\n')
        wx.MessageBox("Error", "Error", style = wx.ICON_ERROR)

    def OnDragOver(self, *args):
        wx.CallAfter(self._callback)
        return wx.TextDropTarget.OnDragOver(self, *args)

class DropFrame(wx.Frame):
    def __init__(self):
        wx.Frame.__init__(self, None)
        text = wx.TextCtrl(self, wx.ID_ANY)
        text.SetDropTarget(TextDropTarget(text, self._callback))

    def _callback(self):
        self.Raise()
        self.SetFocus()

app = wx.PySimpleApp()
frame = DropFrame()
app.SetTopWindow(frame)
frame.Show()
app.MainLoop()
person Anurag Uniyal    schedule 23.09.2009
comment
Это не совсем то, что я хотел - это решение вызывает окно OnDragOver, а я бы хотел сделать это в OnDropText - когда текст отбрасывается (как в WordPad). К сожалению, перенос этого в OnDropText не работает :(. - person uhz; 23.09.2009
comment
Хорошо, это с OnData работает так, как я хотел :). Спасибо за совет :) - person uhz; 23.09.2009

Разве это не сработает?

class DropFrame(wx.Frame):
    def __init__(self):
        wx.Frame.__init__(self, None)
        text = wx.TextCtrl(self, wx.ID_ANY)
        self.SetFocus() # Set's the focus to this window, allowing it to receive keyboard input.
        text.SetDropTarget(TextDropTarget(text))

wx.Frame наследуется от _ 3_, у которого есть _ 4_.


Я только что протестировал, и он работает. Просто переместил SetFocus перед SetDropTarget, так как это более чистое поведение.

person Esteban Küber    schedule 22.09.2009
comment
но вы сосредотачиваетесь на создании, то, что происходит позже, теряет фокус, например. пользователь переходит в другое окно - person Anurag Uniyal; 23.09.2009