2009-09-22 8 views
2

Je voudrais mettre en œuvre glisser & baisse de wxPython qui fonctionne de manière similaire dans WordPad/Eclipse etc je veux dire les éléments suivants:wxpython drag & drop problème de mise au point

quand quelque chose est tombé à WordPad, fenêtre WordPad est en haut avec la mise au point et le texte est ajouté. Dans le texte de l'éditeur Eclipse est collé, la fenêtre Eclipse gagne le focus et est en haut.

Lorsque j'implante glisser & drop utilisant la fenêtre cible wxPython n'est pas amené à l'avant. J'ai mis en drag & baisse de manière similaire à (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() 

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

Lorsque vous exécutez les deux programmes, les fenêtres de place dans le centre de l'écran (une partie de la fenêtre de dépôt est visible), puis faites glisser un noeud depuis la fenêtre de déplacement pour faire tomber la fenêtre - la fenêtre cible affiche la boîte de message qui n'est pas visible, la fenêtre cible est cachée derrière la fenêtre source.

Comment implémenter glisser & drop qui se concentrera sur la deuxième fenêtre (cible)? J'ai essayé d'ajouter window.Show(), window.SetFocus(), même en utilisant certaines fonctions de WinAPI (via win32gui). Je pense qu'il devrait y avoir une façon standard de le faire. Qu'est-ce que je rate?

Répondre

1

Vous devez faire tout ce que vous voulez int méthode DragOver de DropTarget e.g. là, vous pouvez soulever et mettre l'accent sur la fenêtre

exemple de code travaillant pour cible

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

Ce n'est pas exactement ce que je voulais - cette solution soulève la fenêtre OnDragOver, alors que je voudrais le faire dans OnDropText - quand le texte est supprimé (comme dans WordPad) . Malheureusement, déplacer ceci vers OnDropText ne fonctionne pas :(. – uhz

+0

Ok, faire cela avec OnData fonctionne comme je le voulais :). Merci pour le conseil :) – uhz

0

Cela ne fonctionnerait-il pas?

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 hérite de wx.Window, qui a SetFocus(self).


Je viens de tester et il fonctionne. Juste déplacé SetFocus avant SetDropTarget, comme son un comportement plus propre.

+0

mais vous mettez l'accent sur la création, ce qui se passe plus tard, il desserre se concentrer par exemple l'utilisateur va à l'autre fenêtre –

+0

Curieusement, cela a fonctionné ... – voyager