pythonGUI写一个exe桌面应用程序

一、整体步骤

  • 1、安装pyinstaller 3.0
  • 2、安装wxpython
  • 3、安装布局工具wxFormBuilder
  • 4、将png生成icon
  • 5、upx391w(打包成exe程序)

二、工具安装

  • 安装布局工具(wxFormBuilder_v3.5.1-rc1.exe)

    • 下载地址:http://sourceforge.net/projects/wxformbuilder/files/wxformbuilder/3.1.70/
    • 教程地址:https://www.cnblogs.com/jikeboy/p/5648009.html
    • 教程地址:https://blog.51cto.com/yuyongid/1717514
  • 安装第三方库

    pip install pyinstaller
    pip install wxpython
    
  • 工具安装

    1、安装图像工具png2ico:绿色版解压即可
    2、安装打包工具upx391w:绿色版解压即可
    

三、布局工具使用

一、布局工具(wxFormBuilder)
第一步:准备一个窗体【forms 可以理解为html文件】
1、点击wxformbuilder上方的标签“forms”
2、并点击标签下方的第一个类似窗体的图标“Frame”
3、下面就会出现一个窗体
4、说明:但是现在还不能直接往窗体上添加各种控件。咱们还需要给窗体添加布局器BoxSizer

第二步:添加布局器【可以理解为html标签】
1、点击wxformbuilder上方的标签“Layout(倒数第3个)
2、并点击标签下方的图标“wxGridBagSizer”(顺数第5个)
3、添加一个只有以列控件布局的布局器
4、说明:窗体上并没有什么变化。但是窗口左边的目录树有变化了,窗体下布局器多了一个红色边框

第三步:放置控件【可以理解为标签元素】
控件介绍(左起)
1、wxbutton(按钮)
2、wxBitmapButton(问号提示按钮)
3、wxStaticText(文本)
4、wxTextCtrl(文本输入框)
    1、选中wxTextCtrl元素设置默认值
    2、value写入默认值
    3、控制自动换行:
       wxTextCtrl---style---勾选wx.TE_MULTILINE
5、wxComboBox(下拉选择框)
6、wxChoice(下拉选择框)
  1、选择下来元素
  2、添加下拉选项
     wxChoice---choices---点右边---添加选项
  3、selection:通过索引指定默认选项值,0表示选择第一个选项
7、wxListBox(大文本框)
8、wxListCtrl(大下拉选择框)

第四步:调整空间位置
控件属性说明
1、name:实体对象的变量名
2、label:GUI页面显示的名称
3、控件尺寸属性
   1、wxWindow---size:Width:宽度,height:高度
4、控件位置属性
   1、gbsizeritem--row,column:行,列起始值为0

四、png生成icon

1、将png2ico.ip解压到D:\png2ico
2、将要转化的png,切成如下规格的.png图片 248*248 128*128 64*64 48*48 32*35 16*16
3、将这些.png图片全放到D:\png2ico目录
4、在命令行,进入D:\png2ico
5、再在命令行执行命令:png2ico qq.ico logo248.png logo128.png logo64.png logo48.png logo32.png logo16.png
6、执行完,程序会在D:\png2ico目录生成qq.ico

五、exe程序打包工具(upx391w)

"""
pyinstaller  打包
1、安装upx391w(解压即可)
2、在upx391w里面新建文件夹,将需要打包的.py文件放进去
3、cmd进入该目录执行命令:pyinstaller -wF dFraud.py  realName.py start.py --upx-dir upx391w
4、upx391w\build01\dist  目录下会生成.exe文件
pyinstaller -wF --icon=D:\20170508\upx391w\build01\qq.ico dFraud.py  realName.py start.py  --upx-dir upx391w
"""
1、把需要打包的py文件放到这个目录下,新建一个文件夹里面放需要打包的py文件
2、cmd 到这个新建的文件夹下
3、执行命令
如果是在build目录下就不需要加F参数
pyinstaller -wF --icon=qq.ico demo01.py  --upx-dir upx391w
在外面目录
pyinstaller -wF --icon=D:\20170508\upx391w\build01\qq.ico dFraud.py  realName.py start.py  --upx-dir upx391w

六、函数使用

1、文本框赋值
self.m_textCtrl104.SetValue(u'哇靠,发布借款报错了')
2、获取文本框内容
value = self.m_textCtrl1.GetValue()
3、获取下拉框的值
value = self.m_choice1.GetCurrentSelection()
4、事件函数语法
def test_fun(self,event):
        #event:接收self.Bind方法的event参数,名字可以随便写
        self.m_textCtrl32.SetValue('嗯,测试成功')
5、事件绑定
"""
handler:绑定函数
source:绑定按钮
"""
self.Bind(event=wx.EVT_BUTTON,handler=self.button1,source=self.m_button1)

七、完整例子

"""
event:接收self.Bind方法的event参数,名字可以随便写
value = self.m_textCtrl1.GetValue()  获取文本内容
value = self.m_choice1.GetCurrentSelection() 获取下拉框的值
self.m_textCtrl2.SetValue(response.json())  # 设置文本框的值
"""
import requests
import wx
import wx.xrc
import ast
import json
class MyFrame1(wx.Frame):

    def __init__(self, parent):
        wx.Frame.__init__(self, parent, id=wx.ID_ANY, title=wx.EmptyString, pos=wx.DefaultPosition,
                          size=wx.Size(900, 560), style=wx.DEFAULT_FRAME_STYLE | wx.MINIMIZE_BOX)

        self.SetSizeHintsSz(wx.DefaultSize, wx.DefaultSize)

        gbSizer1 = wx.GridBagSizer(0, 0)
        gbSizer1.SetFlexibleDirection(wx.BOTH)
        gbSizer1.SetNonFlexibleGrowMode(wx.FLEX_GROWMODE_SPECIFIED)

        self.m_staticText1 = wx.StaticText(self, wx.ID_ANY, u"接口地址", wx.DefaultPosition, wx.DefaultSize, 0)
        self.m_staticText1.Wrap(-1)
        gbSizer1.Add(self.m_staticText1, wx.GBPosition(0, 0), wx.GBSpan(1, 1), wx.ALL, 5)

        self.m_textCtrl1 = wx.TextCtrl(self, wx.ID_ANY, u"http://httpbin.org/post", wx.DefaultPosition,
                                       wx.Size(300, -1), 0)
        gbSizer1.Add(self.m_textCtrl1, wx.GBPosition(0, 1), wx.GBSpan(1, 1), wx.ALL, 5)

        self.m_staticText2 = wx.StaticText(self, wx.ID_ANY, u"请求参数", wx.DefaultPosition, wx.DefaultSize, 0)
        self.m_staticText2.Wrap(-1)
        gbSizer1.Add(self.m_staticText2, wx.GBPosition(1, 0), wx.GBSpan(1, 1), wx.ALL, 5)

        self.m_textCtrl2 = wx.TextCtrl(self, wx.ID_ANY, u"{\n\"user_name\":\"admin\",\n\"passwd\":\"123456\"\n}",
                                       wx.DefaultPosition, wx.Size(300, 100), wx.TE_MULTILINE)
        gbSizer1.Add(self.m_textCtrl2, wx.GBPosition(1, 1), wx.GBSpan(1, 1), wx.ALL, 5)

        self.m_staticText3 = wx.StaticText(self, wx.ID_ANY, u"请求类型", wx.DefaultPosition, wx.DefaultSize, 0)
        self.m_staticText3.Wrap(-1)
        gbSizer1.Add(self.m_staticText3, wx.GBPosition(2, 0), wx.GBSpan(1, 1), wx.ALL, 5)

        m_choice1Choices = [u"POST", u"GET"]
        self.m_choice1 = wx.Choice(self, wx.ID_ANY, wx.DefaultPosition, wx.DefaultSize, m_choice1Choices, 0)
        self.m_choice1.SetSelection(0)
        gbSizer1.Add(self.m_choice1, wx.GBPosition(2, 1), wx.GBSpan(1, 1), wx.ALL, 5)

        self.m_staticText4 = wx.StaticText(self, wx.ID_ANY, u"响应结果", wx.DefaultPosition, wx.DefaultSize, 0)
        self.m_staticText4.Wrap(-1)
        gbSizer1.Add(self.m_staticText4, wx.GBPosition(3, 0), wx.GBSpan(1, 1), wx.ALL, 5)

        self.m_textCtrl3 = wx.TextCtrl(self, wx.ID_ANY, wx.EmptyString, wx.DefaultPosition, wx.Size(300, 300), wx.TE_MULTILINE)
        gbSizer1.Add(self.m_textCtrl3, wx.GBPosition(3, 1), wx.GBSpan(1, 1), wx.ALL, 5)

        self.m_button1 = wx.Button(self, wx.ID_ANY, u"发送请求", wx.DefaultPosition, wx.DefaultSize, 0)
        gbSizer1.Add(self.m_button1, wx.GBPosition(0, 2), wx.GBSpan(1, 1), wx.ALL, 5)

        self.SetSizer(gbSizer1)
        self.Layout()
        self.Centre(wx.BOTH)

        #绑定事件
        self.Bind(event=wx.EVT_BUTTON, handler=self.test_fun, source=self.m_button1)

    def __del__(self):
        pass

    def test_fun(self,event):
        try:
            url = self.m_textCtrl1.GetValue()
            data = self.m_textCtrl2.GetValue()
            method_num = self.m_choice1.GetCurrentSelection()
            method = "POST" if method_num == 0 else "GET"
            response = requests.request(method,url,json=ast.literal_eval(data))
            self.m_textCtrl3.SetValue(json.dumps(response.json(),indent=4))  # 设置文本框的值
        except Exception as e:
            self.m_textCtrl3.SetValue(e)

if __name__ == '__main__':
    app = wx.App(False)
    test = MyFrame1(None) # 创建窗口
    test.Centre() # 窗口居中
    test.Show() # 显示窗口
    app.MainLoop() # 运行程序

你可能感兴趣的:(python,ui,开发语言)