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