动态更改wx.Dialog wx.CLOSE_BOX样式

时间:2012-06-03 21:39:44

标签: wxpython

我想创建一个wx.Dialog窗口,我可以动态地使窗口具有wx.CLOSE_BOX样式,但是能够暂时禁用它并让它在不可用时看起来已禁用。我知道在控件的消息处理程序中我需要注意wx.EVT_CLOSE事件并跳过,忽略或否决它适合我所处的状态,但我希望标题栏中的小X能够直观地反映我的也是。

我想在关闭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

2 个答案:

答案 0 :(得分: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传播将关闭对话框。因此,除非我们想要关闭窗口,否则我们不要调用此行非常重要。

答案 1 :(得分: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()