wxPython Modal Dialog模式对话框,Python对话框中打开对话框

今天用wxPython写一个输入关键词自动生成文章工具,设置部分需要用模式对话框来打开设置界面。下面介绍wxPython Modal Dialog模式对话框:

1. Modal Dialog(模式对话框)

A modal dialog blocks other widgets from receiving user events until it is closed;

in other words, it places the user in dialog mode for the duration of its existence.

模式对话框阻塞了别的窗口部件接收用户事件,直到该模式对话框被关闭。

严格来说,dialog 与 frame 在外观上没有区别,只是处理事件(event)的方式不一样。

通常,dialog 在外观上要稍微简单一点,所以很少使用 wx.Panel。

wx.Dialog 具备 wx.Panel 的性质,widgets 一般直接添加到 wx.Dialog 中即可。

# -*- coding: utf-8 -*-

import wx
import wx.xrc
import json
import os

###########################################################################
## Class MyDialog2
###########################################################################

class MySettingDialog(wx.Dialog):
    def __init__(self, parent):
        wx.Dialog.__init__(self, parent, id=wx.ID_ANY, title=u"设置", pos=wx.DefaultPosition, size=wx.Size(350, 235),
                           style=wx.DEFAULT_DIALOG_STYLE)

        self.SetSizeHints(wx.DefaultSize, wx.DefaultSize)

        bSizer3 = wx.BoxSizer(wx.VERTICAL)

        wSizer3 = wx.WrapSizer(wx.HORIZONTAL, wx.WRAPSIZER_DEFAULT_FLAGS)

        self.m_staticText45 = wx.StaticText(self, wx.ID_ANY, u"智能写作API:", wx.DefaultPosition, wx.DefaultSize, 0)
        self.m_staticText45.Wrap(-1)

        wSizer3.Add(self.m_staticText45, 0, wx.ALL | wx.ALIGN_CENTER_VERTICAL, 10)

        self.m_textCtrl2 = wx.TextCtrl(self, wx.ID_ANY, wx.EmptyString, wx.DefaultPosition, wx.Size(215, -1), 0)
        wSizer3.Add(self.m_textCtrl2, 0, wx.ALL | wx.ALIGN_CENTER_VERTICAL, 5)

        bSizer3.Add(wSizer3, 0, 0, 5)

        wSizer4 = wx.WrapSizer(wx.HORIZONTAL, wx.WRAPSIZER_DEFAULT_FLAGS)

        self.m_staticText46 = wx.StaticText(self, wx.ID_ANY, u"自动排版API:", wx.DefaultPosition, wx.DefaultSize, 0)
        self.m_staticText46.Wrap(-1)

        wSizer4.Add(self.m_staticText46, 0, wx.ALL | wx.ALIGN_CENTER_VERTICAL, 10)

        self.m_textCtrl3 = wx.TextCtrl(self, wx.ID_ANY, wx.EmptyString, wx.DefaultPosition, wx.Size(215, -1), 0)
        wSizer4.Add(self.m_textCtrl3, 0, wx.ALL | wx.ALIGN_CENTER_VERTICAL, 5)

        bSizer3.Add(wSizer4, 0, 0, 5)

        wSizer5 = wx.WrapSizer(wx.HORIZONTAL, wx.WRAPSIZER_DEFAULT_FLAGS)

        self.m_staticText47 = wx.StaticText(self, wx.ID_ANY, u"智能标题API:", wx.DefaultPosition, wx.DefaultSize, 0)
        self.m_staticText47.Wrap(-1)

        wSizer5.Add(self.m_staticText47, 0, wx.ALL | wx.ALIGN_CENTER_VERTICAL, 10)

        self.m_textCtrl4 = wx.TextCtrl(self, wx.ID_ANY, wx.EmptyString, wx.DefaultPosition, wx.Size(215, -1), 0)
        wSizer5.Add(self.m_textCtrl4, 0, wx.ALL | wx.ALIGN_CENTER_VERTICAL, 5)

        bSizer3.Add(wSizer5, 0, 0, 5)

        wSizer6 = wx.WrapSizer(wx.HORIZONTAL, wx.WRAPSIZER_DEFAULT_FLAGS)

        self.m_button1 = wx.Button(self, wx.ID_ANY, u"取消", wx.DefaultPosition, wx.DefaultSize, 0)
        wSizer6.Add(self.m_button1, 0, wx.ALL, 10)

        self.m_button2 = wx.Button(self, wx.ID_ANY, u"保存", wx.DefaultPosition, wx.DefaultSize, 0)
        wSizer6.Add(self.m_button2, 0, wx.ALL, 10)

        bSizer3.Add(wSizer6, 0, wx.ALIGN_RIGHT, 5)

        wSizer7 = wx.WrapSizer(wx.HORIZONTAL, wx.WRAPSIZER_DEFAULT_FLAGS)

        self.m_staticText48 = wx.StaticText(self, wx.ID_ANY, u"API说明请访问小发猫官网。", wx.DefaultPosition, wx.DefaultSize, 0)
        self.m_staticText48.Wrap(-1)

        wSizer7.Add(self.m_staticText48, 0, wx.ALL | wx.ALIGN_CENTER_VERTICAL, 10)

        bSizer3.Add(wSizer7, 0, 0, 5)

        self.SetSizer(bSizer3)
        self.Layout()

        self.Centre(wx.BOTH)
        self.filename = ‘config.json‘
        self.make_sure_config_exists()
        self.read_config()

        self.m_button1.Bind(wx.EVT_LEFT_UP, self.m_button1OnLeftUp)
        self.m_button2.Bind(wx.EVT_LEFT_UP, self.m_button2OnLeftUp)
        self.Bind(wx.EVT_CLOSE, self.OnClose)

    def __del__(self):
        pass

    def OnClose(self, event):
        self.Destroy()

    # Virtual event handlers, overide them in your derived class
    def m_button2OnLeftUp(self, event):
        rewrite_url = self.m_textCtrl2.GetValue()
        title_url = self.m_textCtrl4.GetValue()
        type_url = self.m_textCtrl3.GetValue()
        self.save_config(rewrite_url, title_url, type_url)
        self.OnClose(event)
        #event.Skip()

    def m_button1OnLeftUp(self, event):
        self.OnClose(event)
        #event.Skip()

    def read_config(self):
        with open(self.filename, "r") as f:
            ajson = json.load(f)
            load_dict = json.loads(ajson)
            print(load_dict)
            self.m_textCtrl2.SetValue(load_dict[‘rewrite‘])
            self.m_textCtrl4.SetValue(load_dict[‘title‘])
            self.m_textCtrl3.SetValue(load_dict[‘type‘])

    def save_config(self, rewrite, title, type):
        dict_var = {
            ‘rewrite‘: rewrite,
            ‘title‘: title,
            ‘type‘: type
        }
        new_dict = json.dumps(dict_var)
        with open(self.filename, "w") as f:
            json.dump(new_dict, f)

    def make_sure_config_exists(self):
        filename = self.filename
        if os.path.exists(filename):
            return True
        else:
            save_config(‘‘, ‘‘, ‘‘)

        return True

‘‘‘
app = wx.App(False)
dlg = MySettingDialog(None)
dlg.Show()
app.MainLoop()
‘‘‘

  

2. 展示与关闭 Dialog
Modal Dialog 与 普通的 Frame 用法略有差别。

最简单的示例代码如下:

import wx

class SubclassDialog(wx.Dialog):
    def __init__(self):
        wx.Dialog.__init__(self, None, -1, ‘Dialog Subclass‘, size=(300, 100))
        okButton = wx.Button(self, wx.ID_OK, "OK", pos=(15, 15))
        okButton.SetDefault()
        cancelButton = wx.Button(self, wx.ID_CANCEL, "Cancel", pos=(115, 15))

if __name__ == ‘__main__‘:
    app = wx.PySimpleApp()
    dialog = SubclassDialog()
    result = dialog.ShowModal()
    if result == wx.ID_OK:
        print "OK"
    else:
        print "Cancel"
    dialog.Destroy()

2.1 展示 Dialog

展示 Dialog 使用 ShowModal(),程序会等待 ShowModal() 执行结束并获取其返回值。

此时,Dialog 是 wxPython 应用接受用户事件的唯一组件。其他应用不受影响。

2.2 结束 Dialog Mode

调用 EndModal(retCode) 方法可以关闭(close)Dialog Mode,retCode 是 int 值,被 ShowModal() 返回。

此时,只是结束了 Dialog Mode,并未摧毁 Dialog。可以在其他地方继续展示该 Dialog。

通常在 event 的 handler 中调用 EndModal()。

2.3 摧毁 Dialog

调用 Destroy() 方法

2.4 典型用法

dialog = SubclassDialog()
result = dialog.ShowModal()  # 展示对话框,并等待结果
if result == wx.ID_OK:  # 判断结果,并执行相应处理
    print "OK"
else:
    print "Cancel"
dialog.Destroy()  # 摧毁 Dialog

  

2.5 自定义 event 的 handler,一般需要调用 EndModal()

例如,用于连接数据库的 handler 实现如下:

def OnConnect(self, event=None):
    host = self.input_host.GetValue()
    port = int(self.input_port.GetValue())
    if db.connect(host, port):  # connected
        self.EndModal(wx.ID_OK)
    else:
        msg_error = ‘Error connecting to host(%s)‘ % host
        wx.MessageBox(msg_error, ‘Error‘, wx.OK | wx.ICON_ERROR)

  

我的其他文章:

python字符串中字符出现次数(python获取字符串个数)

小发猫AI标题自动生成神器,人工智能能做的东西有很多

从学习python到用wxpython编写接口和客户端

不要再纠结Python哪个版本好,2020年用Python3就对了

为什么用Python,高级的Python是一种高级编程语言

原文地址:https://www.cnblogs.com/phploser/p/12663965.html

时间: 2024-10-07 19:42:05

wxPython Modal Dialog模式对话框,Python对话框中打开对话框的相关文章

修改JFileChooser对话框风格,设置打开对话框的默认文件名,获取改变路径之后的文件保存路径

Javascript是一种基于对象(object-based)的语言,你遇到的所有东西几乎都是对象.但是,它又不是一种真正的面向对象编程(OOP)语言,因为它的语法中没有class(类). 那么,如果我们要把"属性"(property)和"方法"(method),封装成一个对象,甚至要从原型对象生成一个实例对象,我们应该怎么做呢? 一. 生成对象的原始模式 假定我们把猫看成一个对象,它有"名字"和"颜色"两个属性. var C

VC中打开对话框选择文件和文件夹

1.选择文件 CFileDialogdlg(true, NULL, NULL, NULL, "所有文件 | *.*", this); if (IDOK == dlg. DoModal()) { MessageBox(dlg .GetPathName(), _T("" )); } 2.选择文件夹 BROWSEINFO bi ;            // BROWSEINFO结构体 TCHAR Buffer [512] = ""; TCHAR Fu

关于JFace中的对话框Dialog类

对话框是软件系统中最常用到的界面,对话框无处不在,从界面结构来说,对话框主要是由主体的界面组件和底部窗体按钮组成. 之前的例子中已经频繁的使用到了MessageDialog.openInformation方法来弹出一个简单的对话框.MessageDialog只是Dialog中的一种. 在Dialog中还有很多其他的对话框可以使用. 信息提示框(MessageDialog类) 1.static void openInformation(Shell parent, java.lang.String

MFC中模态对话框和非模态对话框

MFC的对话框非为两种,一种叫模态对话框(Modal  Dialog  Box,又叫做模式对话框),一种叫做非模式对话框(Modaless Dialog Box,又叫无模式对话框).两者的区别在于当对话框打开的时候,是否允许用户进行其他对象的操作. 一.模态对话框 模态对话框指,当用户需要对该对话框之外的其他对话框或者模块进行操作时,必须该对话框关闭,才能去编辑其他对话框或者模块. 创建如下: //创建模态对话框 CModalDialog modalDialog; modalDialog.DoM

DirectUI中模态对话框和菜单的原理

经常有人问关于模态对话框和系统菜单内部实现原理方面的问题, 因为系统通过API隐藏了太多细节,这2个问题确实令初学者甚至是有经验的开发者困扰, 下面是我个人的一些经验总结. 先说模态对话框,外部看模态对话框其实就是Dialog弹出以后函数(或者说调用栈call stack)不直接返回, 而是要让你做出选择后关闭Dialog, 然后程序再继续往下执行.在你关闭Modal Dialog之前, 你不能做其他操作.下面是我自己模拟模态对话框行为的代码: #define MODAL_DLG_EXIT_NO

vc中改变对话框的背景色

---- 笔者曾在<软件报>2000年第5期中讨论过如何改变控件的颜色,但还有相当一部分的读者来信提问:一个基于对话框的MFC AppWizard应用程序中,如何改变对话框的背景颜色呢?对于这个问题,其实可以由几种不同的方法来实现,具体如下(粗斜体代码为增添的): ---- 方法一:调用CWinApp类的成员函数SetDialogBkColor来实现. ---- 其中函数的第一个参数指定了背景颜色,第二个参数指定了文本颜色.下面的例子是将应用程序对话框设置为蓝色背景和红色文本,步骤如下: --

Android中的普通对话框、单选对话框、多选对话框、带Icon的对话框、以及自定义Adapter和自定义View对话框详解

对话框就是一个AlertDialog,但是一个简单的AlertDialog,我们却可以将它玩出许多花样来,下面我们就来一起总结一下AlertDialog的用法.看看各位童鞋在平时的工作中否都用到了AlertDialog的这些特性. OK,废话不多说,进入我们今天的正题. 普通对话框 普通对话框就是我们最最常用的对话框,实现起来并不复杂,实现出来的效果当然也是最简单的,如下: AlertDialog dialog = new AlertDialog.Builder(this).setTitle("

GTK+系统中的对话框(GTK+dialogs)

GTK+系统中的对话框(GTK+ dialogs) 在接下来的章节中我们将着重介绍GTK+系统中的对话框. 对话框窗口是众多GUI应用程序中不可或缺的部分.对话框经常是很多人进行信息交流的桥梁.在计算机中,对话框也经常扮演着我们和应用程序进行对话的工具.对话框可以用来输入数据,修改数据,或者改变应用程序的使用设置信息.对话框是一个人机交互的重要手段. 消息对话框(Message dialogs) 消息对话框可以方便的在你的应用程序中,跳出来显示一些有用的信息.当然可以包含文字或者图象. #inc

GTK+重拾--08 GTK+中的对话框

(一):写在前面 在这一个小节中,我们主要学习的是GTK+中的对话框.对话框窗口是众多GUI应用程序中不可或缺的部分.对话框是经常在窗口应用中使用的.对话框可以用来输入数据,修改数据,或者是改变应用程序的使用设置信息等等.下面我们就通过分类来讲解如何使用各种类型的对话框. (二):消息对话框 消息对话框可以方便在我们的应用程序中,跳出来显示一些有用的信息,其中也可以包含文字或者图像. 下面我们来看一个例子: #include <gtk/gtk.h> /** * 信息对话框 */ void sh