龙空技术网

wxPython -对话框Dialog

爱好史地的coder 407

前言:

如今咱们对“python对话框”大体比较关心,同学们都需要分析一些“python对话框”的相关资讯。那么小编在网摘上搜集了一些关于“python对话框””的相关文章,希望小伙伴们能喜欢,同学们快快来学习一下吧!

实战wxPython系列-021

对话框是GUI应用中一个重要组成部分。在GUI应用中,对话框常用于输入修改数据,选择文件、字体、颜色,参数配置,消息显示等交互操作。

wx.Dialog类是所有对话框窗口类的的基类,一个对话框应用类一般都从wx.Dialog类或者其子类派生(wx.PrintDialog例外,它调用系统原生对话框)。wx.Dialog常用来完成一个交互任务或者作为应用的顶层窗口使用。

在前面的几篇文章中,我们详细介绍了wxPython系统提供的几种标准对话框,它们绝大多数都继承自wx.Dialog。本文将介绍,如何使用wx.Dialog,来定制自己的对话框。

一、wx.Dialog简介

wx.Dialog对话框时一个带有标题栏的窗口(必要时候还带有一个系统菜单)。在一个对话框中可以包含控件和其他窗口,通过这些控件和窗口,用户可以做出一些选择或者回答一些问题等等。对话框可以自动滚动。通常情况下,一个对话框包含一个甘比按钮,或者包含两个按钮,一个用于确认(OK),一个用于取消(Cancel)。如果有取消按钮,当用户按下”Esc”键时,则会自动激活该按钮的功能。在默认情况下,wx.Dialog带有两个标准的按钮wx.ID_OK 和wx.ID_CANCEL 。

对话框一般分为模式对话框和无模式对话框两种表现形式。

模式对话框在关闭它之前,不能与同一个应用程序的其他窗口进行交互,它是阻塞式调用方式,模式对话框通过调用ShowModal()方法实现,使用模式对话框时,事件就在对话框内部循环,必须将对话框关闭才能继续执行主界面的操作。对于参数选择的对话框,一般用模式对话框。无模式对话框既可以和它交互,也可以和同一个应用程序的其他窗口交互。它是非阻塞式调用方式,无模式对话框调用Show()方法实现。对于显示或查看某些内容的对话框,一般用无模式对话框。

一个模式对话框通常用下面的方式创建:

# 在Python中,我们不必担心堆栈和堆之间的关系,但是# 这意味着需要摧毁对话框。模式对话框的典型用法如下:def AskUser(self):    try:        dlg = MyAskDialog(self)        if dlg.ShowModal() == wx.ID_OK:            # do something here            print('Hello')        else:            # handle dialog being cancelled or ended by some other button            ...    finally:        #显式地使对话框自行销毁        dlg.Destroy()

也可以通过使用更简单的代码来实现对话框的相同结果:

#在Python中,通过使用对话框作为上下文管理器,#使用with语句,事情可以变得简单一些,就像这样:def AskUser(self):    with MyAskDialog(self) as dlg:        if dlg.ShowModal() == wx.ID_OK:            # do something here            print('Hello')        else:            # handle dialog being cancelled or ended by some other button            ...    #对话框在退出上下文管理器时自动销毁

应用程序可以通过为对话框定义一个wx.CloseEvent句柄来响应系统的关闭事件。wx.Dialog支持以下窗口样式:

wx.CAPTION:在对话框上添加标题。wx.DEFAULT_DIALOG_STYLE:相当于wx.CAPTION, wx.CLOSE_BOX两者组合。wx.RESIZE_BORDER:在窗口周围显示可调整大小的框架。wx.SYSTEM_MENU:显示系统菜单。wx.CLOSE_BOX:在框架上显示一个关闭框。wx.MAXIMIZE_BOX:在对话框上显示一个最大化框。wx.MINIMIZE_BOX:在对话框上显示一个最小化框。THICK_FRAME:在窗口周围显示粗框。wx.STAY_ON_TOP:对话框位于所有其他窗口的顶部。NO_3D:此样式已过时,不再做任何事情,请勿在任何新代码中使用它。wx.DIALOG_NO_PARENT:默认情况下,父窗口为None的对话框将以应用程序的顶级窗口作为父窗口。使用这种风格可以防止这种情况发生,并创建一个孤立的对话框。对于模式对话框,不建议这样做。wx.DIALOG_EX_CONTEXTHELP:在Windows下,在标题上放置一个查询按钮。当按下按钮时,Windows将进入上下文敏感的帮助模式,如果用户单击应用程序窗口,wxPython将发送一个wx.EVT_HELP事件。注意,这是一个扩展样式,必须在调用Create之前调用SetExtraStyle来设置。wx.DIALOG_EX_METAL:在macOS上,这种风格的框架将显示为金属外观。这是一个扩展风格。

wx.Dialog常用方法有:

Centre(self, direction=BOTH):窗口居中显示,direction取值为wx.HORIZONTAL, wx.VERTICAL 和 wx.BOTH。GetReturnCode(self):获得窗口的返回码。EndModal(self, retCode):结束一个模式对话框,传递一个从ShowModal调用返回的值。Iconize(self, iconize=True):将窗口图标化或者恢复正常。仅在Windows系统下有效。IsIconized(self):如果窗口被图标化,则返回True。仅在Windows系统下有效。IsModal(self):如果是模式对话框则返回True,否则返回False。SetIcon(self, icon):设置对话的图标。SetReturnCode(self, retCode):设置对话框的返回码。Show(self, show=True):显示或者隐藏对话框。ShowModal(self):显示一个模式对话框。注意,此函数创建了一个临时事件循环,该事件循环优先于应用程序的主事件循环。

图1:wx.Dialog类继承关系

二、wx.Dialog示例

以下代码演示了如何使用wx.Dialog来实现一个基于对话框的应用程序:

#对话框(wx.Dialog)import wximport osclass ChangeDepthDialog(wx.Dialog):    def __init__(self, *args, **kw):        super(ChangeDepthDialog, self).__init__(*args, **kw)                self.InitUi()    def InitUi(self):        #设置标题        self.SetTitle("改变颜色深度")        #设置窗口尺寸        self.SetSize(250, 200)        panel = wx.Panel(self)        vBox = wx.BoxSizer(wx.VERTICAL)        stcBox = wx.StaticBox(panel, label="颜色")        stcBoxSizer = wx.StaticBoxSizer(stcBox, orient=wx.VERTICAL)        stcBoxSizer.Add(wx.RadioButton(panel, label="256色", style=wx.RB_GROUP))        stcBoxSizer.Add(wx.RadioButton(panel, label="16色"))        stcBoxSizer.Add(wx.RadioButton(panel, label="2色"))        hBox1 = wx.BoxSizer(wx.HORIZONTAL)        hBox1.Add(wx.RadioButton(panel, label="自定义"))        hBox1.Add(wx.TextCtrl(panel), flag=wx.Left, border=5)        stcBoxSizer.Add(hBox1)        panel.SetSizer(stcBoxSizer)        hBox2 = wx.BoxSizer(wx.HORIZONTAL)        okButton = wx.Button(self, label="确认")        closeButton = wx.Button(self, label="关闭")        hBox2.Add(okButton)        hBox2.Add(closeButton, flag=wx.LEFT, border=5)        vBox.Add(panel, proportion=1, flag=wx.ALL|wx.EXPAND, border=5)        vBox.Add(hBox2, flag=wx.ALIGN_CENTER|wx.TOP|wx.BOTTOM, border=10)        self.SetSizer(vBox)        okButton.Bind(wx.EVT_BUTTON, self.OnClose)        closeButton.Bind(wx.EVT_BUTTON, self.OnClose)    def OnClose(self, e):        self.Destroy()class SampleDialog(wx.Frame):        def __init__(self, *args, **kw):        super(SampleDialog, self).__init__(*args, **kw)        self.InitUi()    def InitUi(self):        #设置标题        self.SetTitle("实战wxPython: 对话框演示")        #设置窗口尺寸        self.SetSize(360, 240)        tBar = self.CreateToolBar()        tBar.AddTool(toolId=wx.ID_ANY, label="", bitmap=wx.Bitmap(os.path.dirname(__file__) + "/color.png"))        tBar.Realize()        tBar.Bind(wx.EVT_TOOL, self.OnChangeDepth)        self.Centre()    def OnChangeDepth(self, e):        dlg = ChangeDepthDialog(None)        dlg.ShowModal()        dlg.Destroy()def main():    app = wx.App()    sample = SampleDialog(None)    sample.Show()    app.MainLoop()if __name__ == "__main__":    main()

在上述代码中,我们创建了一个改变颜色深度的对话框ChangeDepthDialog,它继承自wx.Dialog,在主窗口中,我们点击工具条上的颜色图标按钮,以模式方式打开ChangeDepthDialog。点击窗口上的”确认”或者”关闭”按钮退出,返回主程序。运行效果如图2所示。

wxPython - 字体选择对话框FontDialog

三、本文知识点

wx.Dialog是其他对话框类的基类。模式对话框和无模式对话框的区别和应用场景。

前一篇:wxPython - 字体选择对话框FontDialog

标签: #python对话框