2012-06-03 93 views
1

我想創建一個wx.Dialog窗口,我可以動態地讓窗口具有wx.CLOSE_BOX樣式,但是可以暫時禁用它,並在顯示時禁用它不可用。我知道在控件的消息處理程序中,我需要注意wx.EVT_CLOSE事件,並跳過,忽略或否決適合我所處的狀態的內容,但我希望標題欄中的小X可以直觀地反映我的狀態也。動態更改wx.Dialog wx.CLOSE_BOX樣式

我目前做到這一點,當我想關閉CLOSE_BOX:

style = self.GetWindowStyle() 
    self.SetWindowStyle(style & (~wx.CLOSE_BOX)) 

,我做到這一點時,我想打開它:

style = self.GetWindowStyle() 
    self.SetWindowStyle(style | wx.CLOSE_BOX) 

,即使我可以告訴對整型DO的更新似乎正在發生,沒有禁用實際對話窗口的X按鈕似乎正在發生。有沒有人知道簡單的方法來做我想做的事情?下面是我試圖動態讓在對話框中改變的屏幕截圖:

enter image description here

+0

到目前爲止,我所知道的,所有的WX。CLOSE_BOX是否指定了「關閉」和「幫助」按鈕,而不是「確定」和「取消」。你能否詳細說明你想要完成什麼? – acattle

回答

1

據我所知,該窗口創建後無法更改該樣式。根據文檔:

此外,請注意,並非所有樣式都可以在 控件創建後更改。

http://docs.wxwidgets.org/stable/wx_wxwindow.html#wxwindowtogglewindowstyle

這裏有一個簡單的測試,我用:

import wx 

def toggle(window): 
    print window.ToggleWindowStyle(wx.CLOSE_BOX) 
    window.Refresh() 
    wx.CallLater(2000, toggle, window) 

def main(): 
    app = wx.App(None) 
    window = wx.Dialog(None) 
    toggle(window) 
    window.ShowModal() 
    window.Destroy() 
    app.MainLoop() 

if __name__ == '__main__': 
    main() 
+0

要清楚的是,FogleBird說你不能改變我想改變的風格(即他提供的示例代碼顯示它實際上並不工作) –

2

你的問題有點含糊不清你想要做什麼,但我假設你想防止人們在應用程序執行某些任務時關閉對話框。

wx.CLOSE_BOX只是一種風格。我試驗過在有和沒有wx.CLOSE_BOX的情況下創建對話框,它所做的只是更改對話框底部的哪些按鈕。即使我沒有設置wx.CLOSE_BOX,仍然有一個OK按鈕可以關閉窗口。除此之外,X按鈕怎麼樣?那麼Alt + F4呢?

您最好的選擇可能是製作您自己的自定義面板,創建您自己的「關閉」按鈕,然後調用Enable(False),直到完成您的過程。但是,這仍然不會阻止用戶單擊X按鈕或按Alt + F4。爲此,您需要趕上wx.EVT_CLOSE。請看下面的例子:

class CustomDialog(wx.Dialog): 
    def __init__(self, parent, title): 
     wx.Dialog.__init__(self, parent=parent, title=title) 

     self.closeButton = wx.Button(self,wx.ID_CLOSE,"Close") 
     self.closeButton.Enable(False) #initialize the button as disabled 

     self.Bind(wx.EVT_BUTTON, self.onClose, id=wx.ID_CLOSE) 
     self.Bind(wx.EVT_CLOSE, self.onClose) 
     #wx.EVT_CLOSE is triggered by the X button or Alt+F4 

    def onClose(self, event): 
     if self.closeButton.IsEnabled(): 
      #if we want to allow the user to close the dialog 

      #do something 

      event.Skip() #allow this event to close the window 

    def reenableButtom(self): 
     self.closeButton.Enable(True) 

然後,您可以手動調用self.reenableButton()當你的進程結束或可將其綁定到一個事件。

self.closeButton.IsEnabled()檢查非常重要,因爲請記住self.onClose()不僅僅是綁定到按鈕。無論用戶點擊「關閉」按鈕,單擊X按鈕還是點擊Alt + F4,我們都希望確保對話框的行爲相同。 event.Skip()讓均勻傳播向上。允許wx.EVT_CLOSE傳播將關閉對話框。因此,除非我們想關閉窗口,否則我們不會稱這條線是非常重要的。

+0

抱歉,模糊不清。我試圖糾正這一點。感謝您的詳細解決方案代碼。我已經知道如何在內部處理這些東西,對不起,我並不清楚我正在尋找如何控制標題欄中關閉按鈕的表示。 –