1

我想创建一个 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 按钮。有谁知道做我想做的事情的简单方法?这是我试图在对话框中动态进行的更改的屏幕截图:

在此处输入图像描述

4

2 回答 2

2

您的问题对您要执行的操作有点含糊,但我假设您想阻止人们在您的应用程序执行某些任务时关闭您的对话框。

wx.CLOSE_BOX只是一种风格。我尝试创建有和没有的对话框,wx.CLOSE_BOX它所做的只是改变对话框底部的按钮。即使我没有设置wx.CLOSE_BOX,仍然有一个确定按钮可以关闭窗口。除此之外,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传播将关闭对话框。因此,除非我们想关闭窗口,否则不要调用此行,这一点非常重要。

于 2012-06-04T05:41:08.183 回答
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()
于 2012-06-04T14:41:24.160 回答