2 Stimmen

wxpython drag&drop Fokus Problem

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?

1voto

Esteban Küber Punkte 35006

Könnte das nicht funktionieren?

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 erbt von wx.Window das hat SetFocus(self) .


Ich habe es gerade getestet und es funktioniert. Gerade verschoben SetFocusSetDropTarget da es ein saubereres Verhalten ist.

1voto

Anurag Uniyal Punkte 81337

Sie müssen alles, was Sie wollen, in der DragOver-Methode von DropTarget tun, z.B. können Sie dort den Fokus auf Ihr Fenster legen und setzen

Beispiel-Arbeitscode für das Ziel

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()

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X