iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > Python >Windows中使用wxPython和py2exe开发Python的GUI程序的实例教程
  • 735
分享到

Windows中使用wxPython和py2exe开发Python的GUI程序的实例教程

实例教程程序wxPython 2022-06-04 18:06:44 735人浏览 薄情痞子

Python 官方文档:入门教程 => 点击学习

摘要

python是支持可视化编程,即编写gui程序,你可以用它来编写自己喜欢的桌面程序。使用wxPython来做界面非常的简单,只是不能像C#一样拖动控件,需要自行写代码布局。在完成编写之后,由于直接的py文件

python是支持可视化编程,即编写gui程序,你可以用它来编写自己喜欢的桌面程序。使用wxPython来做界面非常的简单,只是不能像C#一样拖动控件,需要自行写代码布局。在完成编写之后,由于直接的py文件不能再没有安装python的电脑上运行,能否有一个打包成在任意电脑都能运行的工具,网上找找发现了py2exe正好可以完成这个功能。wxPython和py2exe都是开源免费软件。

环境配置
wxPython: sourceforge项目https://sourceforge.net/projects/py2exe/files/py2exe/0.6.9/
下载后双击安装即可,安装程序会自动安装到对应pythonScripts下。
py2exe:官方下载主页Https://www.wxpython.org/download.PHP
同样双击即可安装,注意下载要对应使用的Python版本。
下面分别示例说明wxPython和py2exe的简单使用。

基本示例
文件名:wxTest.py:


# -*- coding: cp936 -*-
'''MainWindow类完成最简单的编辑功能,添加一个主菜单,两个子菜单(about和exit)'''
import wx
 
class MainWindow(wx.Frame):
 '''定义一个窗口类'''
 def __init__(self, parent, title):
  wx.Frame.__init__(self, parent, title=title, size=(300, 300))
  self.control = wx.TextCtrl(self, style=wx.TE_MULTILINE)
 
  self.setupMenuBar()
  self.Show(True)
 
 def setupMenuBar(self):
  self.CreateStatusBar()
 
  menubar = wx.MenuBar()
  menufile = wx.Menu()
 
  mnuabout = menufile.Append(wx.ID_ABOUT, '&About', 'about this shit')
  mnuexit = menufile.Append(wx.ID_EXIT, 'E&xit', 'end program')
 
  menubar.Append(menufile, '&File')
 
  #事件绑定
  self.Bind(wx.EVT_MENU, self.onAbout, mnuabout)
  self.Bind(wx.EVT_MENU, self.onExit, mnuexit)
   
  self.SetMenuBar(menubar)
 
 def onAbout(self, evt):
   '''点击about的事件响应'''
   dlg = wx.MessageDialog(self, 'This app is a simple text editor', 'About my app', wx.OK)
   dlg.ShowModal()
   dlg.Destroy()
 
 def onExit(self, evt):
   '''点击退出'''
   self.Close(True)
app = wx.App(False)
frame = MainWindow(None, 'Small Editor')
app.MainLoop() #循环监听事件

编辑好改文件后,使用py2exe将Python脚本编译成windows可执行文件,这样就不需要Python解释器了。要使用py2exe,首先要编写一个编译脚本,然后通过Python运行编译脚本即可将其他的脚本编译成可执行文件。以下实例是将要编译成可执行文件的脚本,文件名:setup.py


import distutils
import py2exe
distutils.core.setup(windows=['wxTest.py'])

在setup.py中除了导入必需的模块以外,只有一条语句:


distutils.core.setup(windows=['wxTest.py'])

方括号中就是要编译的脚本名,前边的windows 表示将其编译成GUI程序。如果要编译命令行界面的可执行文件,只要将windows改为console,如果需要将脚本编译成Windows服务,则可以使用service选项。
都编辑好之后,将wxTest.py和setup.py放在同一个路径下,cmd进入该路径,输入:


setup.py py2exe

如果在运行时报以下错误:

error: MSVCP90.dll: No such file or directory
是因为没有找到MSVCP90.dll,在windows目录下搜索MSVCP90.dll这个文件,然后拷到python安装目录的DLLs下就可以了。
当打包PyQt项目时,可能会报以下错误

ImportError: No module named sip
这时只需要在打包时加上--includes sip就行啦,如:

setup.py py2exe --includes sip

运行结束之后,会在路径下生成dist和 build两个目录。其中dist目录中就是编译生成的文件。如果要在其他未安装Python的机器上运行编译好的程序,只要将dist目录复制到其他机器上即可。双击运行wxTest.exe,如图:

查看图片

使用wxPython建立一个计算文件md5的GUI工具
小工具最终是下面这个样子,将文件拖到上面会自动计算其md5与size

查看图片

下面是全部的代码


#coding:gbk
import wx
import optparse
import time,hashlib
import threading
import os

def checkMD5(pefile):
  try:
    f = open(pefile,'rb')
    data = f.read()
    m = hashlib.md5()
    m.update(data)
    f.close()
    return m.hexdigest()
  except:
    return 'error'
  
def getFileSize(filename):
  try:
    size = int(os.path.getsize(filename))
    return size
  except:
    return 'error'
   
#线程函数
class FuncThread(threading.Thread):
  def __init__(self, func, *params, **paramMap):
    threading.Thread.__init__(self)
    self.func = func
    self.params = params
    self.paramMap = paramMap
    self.rst = None
    self.finished = False

  def run(self):
    self.rst = self.func(*self.params, **self.paramMap)
    self.finished = True

  def getResult(self):
    return self.rst

  def isFinished(self):
    return self.finished

def doInThread(func, *params, **paramMap):
  t_setDaemon = None
  if 't_setDaemon' in paramMap:
    t_setDaemon = paramMap['t_setDaemon']
    del paramMap['t_setDaemon']
  ft = FuncThread(func, *params, **paramMap)
  if t_setDaemon != None:
    ft.setDaemon(t_setDaemon)
  ft.start()
  return ft

class FileDropTarget(wx.FileDropTarget):
  def __init__(self, filetext,md5tx,filesizetx):
    wx.FileDropTarget.__init__(self)
    self.filepath = filetext
    self.md5tx = md5tx
    self.filesizetx = filesizetx
   
  def OnDropFiles(self, x, y, fileNames):
    filename = fileNames[0].encode('gbk')
    print filename
    print type(filename)
    self.filepath.SetValue(filename)
    md5 = doInThread(checkMD5,filename)
    filesize = doInThread(getFileSize,filename)
    while True:
      if not md5.isFinished():
        time.sleep(0.5)
      else:
        self.md5tx.SetValue(md5.getResult())
        break
        
    while True:
      if not filesize.isFinished():
        time.sleep(0.5)
      else:
        self.filesizetx.SetValue(str(filesize.getResult()))
        break

class Frame(wx.Frame): #Frame 进行初始化
  def __init__(self,title):
    wx.Frame.__init__(self,None,title=title,size = (400,300))
    boxSizer = wx.BoxSizer(wx.VERTICAL)
    
    self.panel = wx.Panel(self)
    
    # boxSizer.Add(self.panel,1,wx.EXPAND|wx.ALL) #wx.ALL 周围的距离,EXPAND扩充到全部
    
    filepath = wx.StaticText(self.panel,-1,"FileDir(请将文件拖到本对话框中)")
    filetext = wx.TextCtrl(self.panel,-1,"",size=(350,20))
    
    md5st = wx.StaticText(self.panel,-1,"MD5")
    md5tx = wx.TextCtrl(self.panel,-1,size=(250,20))
    
    filesizest = wx.StaticText(self.panel,-1,'FileSize')
    filesizetx = wx.TextCtrl(self.panel,-1,size=(250,20))
    
    # hashst = wx.StaticText(self.panel,-1,'Hash')
    # hashtx = wx.TextCtrl(self.panel,-1,size=(250,20))
    
    boxSizer.Add(filepath,0,wx.EXPAND|wx.LEFT|wx.TOP,border=10)
    boxSizer.Add(filetext,0,wx.LEFT|wx.TOP,border=10)
    boxSizer.Add((-1,20))
    boxSizer.Add(md5st,0,wx.LEFT|wx.TOP,border=10)
    boxSizer.Add(md5tx,0,wx.LEFT|wx.TOP,border=10)
    boxSizer.Add((-1,10))
    boxSizer.Add(filesizest,0,wx.LEFT|wx.TOP,border=10)
    boxSizer.Add(filesizetx,0,wx.LEFT|wx.TOP,border=10)
    # boxSizer.Add((-1,10))
    # boxSizer.Add(hashst,0,wx.LEFT|wx.TOP,border=10)
    # boxSizer.Add(hashtx,0,wx.LEFT|wx.TOP,border=10)
    
    dropTarget = FileDropTarget(filetext,md5tx,filesizetx)
    self.panel.SetDropTarget( dropTarget )
    
    self.panel.SetSizer(boxSizer)    
 
class App(wx.App): ##继承wx.App
  def OnInit(self): ##还没有调起来的时候读取初始化
    self.frame = Frame('MD5&size信息')    
    self.frame.Centre()
    self.frame.Show(True)    
    return True

def killSelf(evt = None):
  os.system('taskkill /F /T /PID %d >NUL 2>NUL' % win32process.GetCurrentProcessId())

if __name__ == '__main__':
  parser = optparse.OptionParser()
  parser.add_option('-x', '--no-update', dest = 'test', action = 'store_true', help = 'start without update')
  parser.add_option('-t', '--no-update-test', dest = 'test2', action = 'store_true', help = 'start without update debug')
  options, args = parser.parse_args()
  if options.test:
    print("-x param")
  if options.test2:
    print("-t param")
  App(redirect = False).MainLoop()

一点点的解释:

class App与App().MainLoop()是固定写法,在class App下有一个def OnInit方法来初始化主的Frame,将其居中并且Show()出来,没什么好说的,主要看一下Frame的定义

这个小工具使用的是boxSizer来布局,为了简单我只使用了一个boxSizer,将里面的所有控件采用VERTICAL(垂直)的方式来布局,如果想要将MD5与后面的文本框放在同一行,那么就需要添加一个水平的boxSizer,然后那将这个水平的boxSizer再放入主的boxSizer


boxSizer = wx.BoxSizer(wx.VERTICAL) #初始化一个垂直的boxSizer,也是整个框架的主Sizer

self.panel = wx.Panel(self) #初始化一个panel,这个panel是放了放之后的控件的

filepath = wx.StaticText(self.panel,-1,"FileDir(请将文件拖到本对话框中)") 
filetext = wx.TextCtrl(self.panel,-1,"",size=(350,20)) 
md5st = wx.StaticText(self.panel,-1,"MD5") 
md5tx = wx.TextCtrl(self.panel,-1,size=(250,20)) 
filesizest = wx.StaticText(self.panel,-1,'FileSize') 
filesizetx = wx.TextCtrl(self.panel,-1,size=(250,20))



上面是初始化相应的静态文本与文本框,方法中的第一个参数是其所在的父类窗口,这里也就是self.panel,其实也可以不用panel,而是将其直接放入到boxSizer中

boxSizer.Add(filepath,0,wx.EXPAND|wx.LEFT|wx.TOP,border=10) 

将filepath加入到主的boxSizer中,这里一开始我有一些困惑,一开始我一直以为先将所有的控件放入到panel中,然后再将panel放入到boxSizer中,但是这样是不对的,而应该是直接就入到boxSizer中,将该控件的父类设置为panel,之后就没有将panel放入boxSizer这一步操作,wx.LEFT|wx.TOP,border=10 这个参数表示的是该控件距离上来左各有10个像素的距离,再使用wx.EXPAND来使其充分的填充其所在的区域,我曾经想,可否设置成距离上10px,左20px,但是貌似不能这样设置,Add函数里只能有一个border参数,换句话说只能设置相同的数值,之后我再找找是否可以实现。


boxSizer.Add((-1,20)) #这个是添加一个空距离,距离上20px

dropTarget = FileDropTarget(filetext,md5tx,filesizetx) 
self.panel.SetDropTarget( dropTarget )

这个是放该窗口类添加一个拖拽方法,也是比较固定的写法

上面的class FileDropTarget中的__init__与OnDropFiles方法也是固定的方法,只是里面的处理函数不同。

wxPython中的一些style与flag等参数在布局中使用需要一些经验,还有它的很多控件和与之绑定的方法,要想熟练掌握还需要下一些工夫,下面两个网站算是介绍比较详细,要多多查阅

--结束END--

本文标题: Windows中使用wxPython和py2exe开发Python的GUI程序的实例教程

本文链接: https://www.lsjlt.com/news/14500.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • C#中Windows服务程序开发的示例分析
    这篇文章主要为大家展示了“C#中Windows服务程序开发的示例分析”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“C#中Windows服务程序开发的示例分析”这篇文章吧。C#Windows服务程...
    99+
    2023-06-17
  • 小程序开发之云函数的使用教程详解
    目录1、云函数1.1 云函数API和云函数创建2、云函数案例1、云函数 云函数是部署在云端的函数,他和小程序本地的函数存在很大的区别,云函数应用涉及云端云函数定义和本地引用云端云函数...
    99+
    2024-04-02
  • Python GUI教程之在PyQt5中使用数据库的方法
    目录PyQt5的SQL数据库支持在PyQt5中简单使用数据库创建一个UI界面连接一个数据库在UI界面查看和修改数据添加和删除数据在桌面图像化界面编程中,我们通常需要将一些数据或配置信...
    99+
    2024-04-02
  • python项目--使用Tkinter的日历GUI应用程序
    目录第一步:安装 Tkinter第二步:导入模块第三步:显示给定年份日历第四步:设置驱动代码第五步:输出日历 GUI总结第一步:安装 Tkinter 首先使用以下命令安装 Tkint...
    99+
    2024-04-02
  • Python并发编程实例教程之线程的玩法
    目录一、线程基础以及守护进程二、线程锁(互斥锁)三、线程锁(递归锁)四、死锁五、队列六、相关面试题七、判断数据是否安全八、进程池 & 线程池总结一、线程基础以及守护进程 线...
    99+
    2024-04-02
  • Python 开发者的微信小程序开发实践
    微信小程序作为一种轻量级的应用形式,在移动互联网领域取得了极大的成功。 作为 Python 开发者,如何在微信小程序的开发中发挥 Python 的优势?本文将为你展示如何从零开始搭建一个基于 Python 的微信小程序项目,包含详细的解决...
    99+
    2023-09-03
    微信小程序 python 小程序
  • Python开发环境用windows配置的实际过程
    本篇内容介绍了“Python开发环境用windows配置的实际过程”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!将windows版pytho...
    99+
    2023-06-17
  • python项目中requirements.txt的用法实例教程
    记录一下2021.12.11搞环境时遇到了一堆问题师兄跟我说的可以用requirements这个去装环境,不用一个一个装 网上查了一下这个requirements.txt,发现pyt...
    99+
    2024-04-02
  • pythonfire库的使用实例教程
    目录一. 介绍二. 安装三. 用法一. 介绍 fire是python中用于生成命令行界面(Command Line Interfaces, CLIs)的工具,不需要做任何额外的工作,...
    99+
    2022-12-29
    python fire库使用 python fire库
  • 小程序中云开发的示例分析
    这篇文章将为大家详细讲解有关小程序中云开发的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。1. 云开发简介由于小程序本身存储数据的能力有限,所以不可能将大量的数据...
    99+
    2024-04-02
  • 详解PyCharm使用pyQT5进行GUI开发的基本流程
    目录一、环境安装1、安装Pycharm2、安装pyQT53、创建工程二、配置扩展工具 1、配置Qt Designer2、配置转换工具三、GUI设计1、打开Qt Design...
    99+
    2024-04-02
  • MFC程序中使用QT开发界面的实现步骤
    目录添加QT依赖添加信号槽机制添加qt界面配置元编译过程一些问题的处理测试信号槽使用qt designer 设计界面如果你有一个现成的MFC项目在做维护,但是你厌倦了使用MFC繁琐的...
    99+
    2024-04-02
  • 如何使用git和Python教程一起load你的程序和文档?
    Git是一种用于版本控制和协作的工具,而Python是一种广泛使用的编程语言。两者的结合可以帮助您更轻松地管理代码、文档和其他项目文件。在本教程中,我们将介绍如何使用Git和Python一起load您的程序和文档。 第一步:安装Git和P...
    99+
    2023-06-26
    教程 load git
  • Windows 上的 Python 打包教程:让你的应用程序更便携!
    在使用 Python 开发应用程序时,打包是一个必不可少的步骤。在 Windows 上,打包 Python 应用程序可以让你的应用程序更加便携,方便分享和部署。本文将为你介绍如何在 Windows 上打包 Python 应用程序。 什么是打...
    99+
    2023-06-17
    windows 打包 教程
  • python的并发和异步编程实例
    关于并发、并行、同步阻塞、异步非阻塞、线程、进程、协程等这些概念,单纯通过文字恐怕很难有比较深刻的理解,本文就通过代码一步步实现这些并发和异步编程,并进行比较。解释器方面本文选择python3,毕竟python3才是python的...
    99+
    2023-01-31
    实例 python
  • 实时开发Java和Unix:你需要的教程!
    Java和Unix是两种广泛使用的技术,它们在软件开发中扮演着重要的角色。Java是一种广泛使用的编程语言,而Unix则是一种广泛使用的操作系统。如果你想成为一名优秀的软件开发人员,你需要掌握这两种技术。 在本篇文章中,我们将探讨如何在U...
    99+
    2023-08-30
    unix 教程 实时
  • 使用终极 GUI 框架 NiceGUI 提升你的 Python 应用程序
    介绍 随着机器学习和深度学习网站应用程序的快速增长,开发人员一直在寻找新的 Web 框架,以便更轻松地构建这些网站应用程序。 数据科学应用程序的普及程度已经上升,因此新的框架也在增加。开发人员创建了许多新的框架,这些框架被证明对构建这些...
    99+
    2023-08-31
    python 开发语言
  • 从零开始学Python教程:如何使用git来load你的程序?
    Python是一门广泛应用于科学计算、人工智能、网络爬虫等领域的编程语言。在学习Python的过程中,熟悉如何使用版本控制工具是非常必要的。本教程将介绍如何使用git来load你的程序。 一、安装git 首先,我们需要安装git。在Win...
    99+
    2023-06-26
    教程 load git
  • python-docx的简单使用示例教程
    python-docx的简单使用 ''' 设置表格所有单元格的四个边为0.5磅,黑色,实线 可以使用返回值,也可以不使用 ''' def 设置表格网格线为黑色实线(table_obj...
    99+
    2023-05-18
    python-docx使用 python-docx
  • Windows上如何使用Go语言和Laravel进行开发?教程来啦!
    在当今互联网时代,软件开发已经成为了一项非常流行的行业,而且随着技术的不断发展,开发工具也在不断更新和演进。本文将介绍如何在Windows系统上使用Go语言和Laravel框架进行开发。 一、安装Go语言环境 首先,我们需要安装Go语言环...
    99+
    2023-10-22
    laravel windows 教程
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作