2011-05-26 53 views
3

我的wxPython應用程序使用wx.ScrolledWindow作爲主要的繪圖區域 - 直接從演示中取出並侵入我的需求。當用戶雙擊滾動區域時,我想彈出一個(可能是模態)對話框來編輯他們繪製的東西的參數。所以我彈出了另一個演示代碼的對話框:防止wxPython事件擊中多個窗口?

def OnLeftDoubleClickEvent(self, event): 
    dlg = TestDialog(self, -1, "Sample Dialog", size=(350, 200), 
        #style=wx.CAPTION | wx.SYSTEM_MENU | wx.THICK_FRAME, 
        style=wx.DEFAULT_DIALOG_STYLE, # & ~wx.CLOSE_BOX 
        ) 
    dlg.CenterOnScreen() 

    # this does not return until the dialog is closed. 
    val = dlg.ShowModal() 

這只是一個測試,當然。對話本身在其中一個演示中進行了嚴格的定義。無論如何,在關閉彈出窗口後,ScrolledArea會跳轉到新的位置,並且在Windows上,鼠標事件不再映射到正確的座標。只有當您移動彈出窗口時纔會發生位移,以便您在鼠標單擊滾動區域的區域之外單擊以關閉它。請記住,「確定」和「取消」與滾動區域處於完全不同的對話框中。在Linux上,滾動區域會根據鼠標點擊區域外的距離而發生移動 - 並且方向相同。在Windows上,滾動的區域會移動併發生混淆 - 進一步的鼠標點擊也會取代它,並且(因爲?)點擊記錄在錯誤的位置。

因此,Linux版本的問題似乎表明,彈出窗口上的單擊事件實際上是由原始窗口中的滾動區域處理的。

這聽起來像是怎麼回事?

如果是這樣,我該如何防止這種情況發生?

編輯:更多信息。 我嘗試通過切換到「確定」或「取消」按鈕來關閉彈出窗口。每次焦點移動到另一個控件時,其他窗口中的滾動區域都會移動。這取決於彈出窗口相對於其他窗口的位置。我現在完全困惑。

編輯2:我在主窗口的菜單中添加了一個選項來觸發彈出對話框。以這種方式激活時,似乎沒有任何問題。我認爲這個問題在某種程度上是由於在滾動區域的雙擊事件中創建了一個彈出窗口,導致一些事件被兩者處理。那有意義嗎?當我有時間時,我會嘗試向父對話框發送一個事件(自定義?),並將它映射到與新菜單項相同的功能。這將導致我的彈出窗口來自主窗口,並希望能夠消除這個問題。我們拭目以待。

EDIT3測試用例

看到這一點,採取文件:從演示ScrolledWindow.py,添加以下內容:

from Dialog import * 

然後在MyCanvas類的鼠標事件區域,用下面的方法綁定雙擊:

self.Bind(wx.EVT_LEFT_DCLICK, self.OnLeftDoubleClickEvent) 

然後將下面的函數添加到同一個類(取自對話框演示):

def OnLeftDoubleClickEvent(self, event): 
    useMetal = False 
    if 'wxMac' in wx.PlatformInfo: 
     useMetal = self.cb.IsChecked() 

    dlg = TestDialog(self, -1, "Sample Dialog", size=(350, 200), 
        #style=wx.CAPTION | wx.SYSTEM_MENU | wx.THICK_FRAME, 
        style=wx.DEFAULT_DIALOG_STYLE, # & ~wx.CLOSE_BOX, 
        useMetal=useMetal, 
        ) 
    dlg.CenterOnScreen() 

    # this does not return until the dialog is closed. 
    val = dlg.ShowModal() 

    if val == wx.ID_OK: 
     self.log.WriteText("You pressed OK\n") 
    else: 
     self.log.WriteText("You pressed Cancel\n") 

    dlg.Destroy() 

現在運行演示並選擇Core Windows/Controls和「ScrolledWindow」。您可以像往常一樣在滾動區域上塗鴉,但現在您可以在該處雙擊並彈出對話框。請將該新對話框移到繪圖區域外,然後在輸入框周圍標籤,或單擊確定。此對話框中的活動將導致其他窗口中的可滾動圖形改變位置。

而你有它。這是什麼造成的?我已經調整了演示來繪製自己的自定義對象,並且我希望能夠雙擊來調出對象屬性對話框。這是一個錯誤還是錯誤的方式? Edit2的計劃更像是「正確的方式」嗎?

+0

我在演示中雙擊時沒有看到此問題。你能提供一個小問題的可運行例子嗎? – 2011-06-01 14:10:59

+0

爲了清楚起見,我的編輯器基於滾動區域演示(繪製事物的地方),上面的代碼片段放置在滾動區域的dclick事件中,並彈出一個對話框,也從演示中獲取。演示本身沒有這個組合。我會看看我是否可以製作一個縮減的測試用例。您必須將對話框移到滾動區域外才能看到問題。 – phkahler 2011-06-02 13:22:47

回答

0

解決方案原來是我在Edit2中提出的。我不確定爲什麼,但是在ScrolledArea DoubleClick事件中執行彈出操作會導致問題。解決方案是創建一個自定義消息,並在雙擊事件中將其發送給自己。自定義事件由頂層窗口處理,而不是滾動區域。這工作正常,但現在我必須將所選對象的ID存儲在某處,以便頂級窗口可以將它傳遞給對話框。這是稍微多一點的工作,但它比在繪圖區域的雙擊事件內彈出一個窗口感覺更「正確」。然而,窗口仍然在事件處理程序中彈出,它只是一個不同的對象,處理它與一個不同的事件。爲什麼這項工作的具體細節仍然沒有我。

我確定有一種思考方式,使得這個解決方案顯然是正確的。我仍然會投票回答一個答案,提供洞察爲什麼一種方法有效,而不是另一種,或者什麼是「正確」的方式來做這種類型的事情。

在其他消息中,我在此問題的+50賞金過期後發佈此消息。是的,我在嘗試自己的想法之前發佈了一個賞金 - 傻了我。下次我會在提供賞金之前嘗試wxPython郵件列表,儘管我不喜歡郵件列表。