wxpython перетаскивание проблемы фокуса - PullRequest
2 голосов
/ 22 сентября 2009

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

Ответы [ 2 ]

1 голос
/ 23 сентября 2009

Вам нужно делать все, что вы хотите, в методе 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()
1 голос
/ 22 сентября 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 наследуется от wx.Window, который имеет SetFocus(self).


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

...