2009-09-22 34 views
2

我想實現的阻力在wxPython中&下降,在同樣的方式工作,在寫字板/ Eclipse中等等。我指的是以下幾點:wxPython的拖放焦點問題

當事情被下降到寫字板,寫字板窗口添加焦點和文字的頂部。在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)。我認爲應該有一些標準的做法。我錯過了什麼?

回答

1

你需要做任何你想做的事情DropTarget的DragOver方法例如在那裏,你可以提高你的窗口上的目標

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

這不完全是我想要的 - 這個解決方案提出了窗口OnDragOver,而我想在OnDropText中做到這一點 - 當文本被丟棄(如寫字板) 。不幸的是移動到OnDropText不起作用:(。 – uhz 2009-09-23 08:12:23

+0

好吧,這樣做與OnData的工作,因爲我想:)。謝謝你的提示 :) – uhz 2009-09-23 08:15:49

0

這不工作?從wx.Window

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繼承,有SetFocus(self)


我剛剛測試過它,它的工作原理。在SetDropTarget之前移動了SetFocus,因爲它是一種更清潔的行爲。

+0

設定對焦

示例代碼的工作,但要設置注重創造,發生的事情後,它失去重點例如用戶轉到其他窗口 – 2009-09-23 06:57:21

+0

奇怪的是,它的工作... – voyager 2009-09-23 14:46:37