精华内容
下载资源
问答
  • Python中我们有很多种方案来编写桌面图形用户界面程序,譬如内置的Tkinter、强大的PyQt5和PySide2,还有wxPython。借助这些或内置或第三方的模块,我们可以轻松地编写跨平台的桌面图形界面程序。同时,我们还能...

    在Python中我们有很多种方案来编写桌面图形用户界面程序,譬如内置的Tkinter、强大的PyQt5和PySide2,还有wxPython。借助这些或内置或第三方的模块,我们可以轻松地编写跨平台的桌面图形界面程序。

    同时,我们还能直接使用PyInstaller、Nuitka、cx_Freeze等Python第三方程序打包模块,将编写好桌面图形界面程序打包为各个平台的二进制可执行程序文件,比如Windows下的exe程序执行文件。

    通常我们会将程序按需打包为单个的exe可执行文件或包含整个文件夹的可执行文件。

    程序更新

    随着版本的迭代和功能的优化,我们编写的程序会需要进行更新。

    在 Web 应用中,这个问题几乎不需要处理,因为只要服务器更新了,浏览器打开的页面或功能都将是最新的。

    而在桌面图形界面程序中,则有点棘手。因为我们打包好的程序都是离线分发的,按照以往的流程,我们需要重新打包程序,然后,在某个页面放上新版本程序的下载链接,最后提醒使用者下载更新。

    如果使用者没有注意到,那么就凉拌了。

    如何解决呢?我们需要在编写的桌面图形界面程序中,额外添加一个更新机制,用于检测更新、下载更新和完成更新。

    下面我们来介绍一下这个流程。

    检测更新

    要实现程序的更新,我们首先需要让程序能够检测到软件存在更新。在这里,我们需要一个远程的更新服务器,来提供更新的检测响应。

    2020-06-29_203039.png

    然后,在程序启动的时候,调用一个子线程,向远程服务器发起请求,以获得是否需要进行更新。

    下载更新

    如果没有程序的更新,自然就略过了。

    如果有程序的更新,我们就需要对新版本的程序进行下载。

    下载有两种方式:

    直接通过主程序进行下载;

    编写一个单独的更新程序,主程序调用更新程序进行下载;

    直接通过主程序进行下载的方式对于下载是可行的,但是没法自己覆盖更新自己。所以我们选择第二种方式。

    2020-06-29_203717.png

    主程序通过一个子线程使用subprocess.Popen()调用打包为单个文件的更新程序。

    然后更新程序再核对一遍是否存在版本更新,如果存在更新,那么继续请求远程服务器,下载新版本的程序。

    2020-06-29_204232.png

    程序文件的下载,我们可以直接使用requests模块,示例代码如下所示:

    def work(self):

    # 新建一个文件对象

    temp_file = os.path.join(self.download_path,'update.zip') # 指定更新包下载的路径

    logger.info("下载临时文件路径为:{}".format(temp_file))

    with open(temp_file,'wb') as self.fileobj:

    # 请求更新文件包

    f = requests.get(self.download_url, stream=True)

    # 写入文件

    offset = 0

    for chunk in f.iter_content(chunk_size=self.buffer):

    if not chunk:

    break

    self.fileobj.seek(offset)

    self.fileobj.write(chunk)

    offset = offset + len(chunk)

    proess = offset / int(self.filesize) * 100

    # logger.info("写入块:{},{}".format(offset,proess))

    self.download_proess_signal.emit(int(proess))

    解压覆盖

    新版本的程序下载完,我们就需要将其解压到原有的文件夹了。这时候,更新程序和主程序分开打包的好处就出来了,我们通过更新程序将正在运行的主程序进程结束掉,然后将新版本的程序压缩包解压覆盖现有程序所在的文件夹:

    2020-06-29_205030.png

    def work(self):

    # 1.杀死主程序进程

    for proc in psutil.process_iter():

    if proc.name() == 'xxx.exe':

    proc.kill()

    # 2.获取程序本地路径

    current_path = os.path.dirname(os.path.abspath(__file__))

    logger.info("当前程序路径:{}".format(current_path))

    # 3.解压新版本压缩包到程序本地路径

    update_file_path = os.path.join(self.download_temp_path, 'update.zip')

    shutil.unpack_archive(

    filename=update_file_path,

    extract_dir=current_path

    )

    # 4.删除临时文件夹和文件

    os.remove(update_file_path)

    shutil.rmtree(self.download_temp_path)

    这样,我们就实现了Python编写的桌面图形界面程序的更新检测、下载和覆盖安装。

    分享到:

    展开全文
  • OpenERP用的就是python。以下说的c/c++、java、python程序员,具有相同的开发能力、熟练程度。我们来做个比较:1.开发时间,肯定比java、c/c++要快;2.安全性,看总体设计;3.单个程序员的费用,肯定要比java、c/c++...

    我个人感觉更适合开发各种管理系统。看我接下来举的例子你就明白了。

    OpenERP用的就是python。以下说的c/c++、java、python程序员,具有相同的开发能力、熟练程度。我们来做个比较:

    1.开发时间,肯定比java、c/c++要快;2.安全性,看总体设计;3.单个程序员的费用,肯定要比java、c/c++高;4.程序员数量,肯定要比java、c/c++要少;5.总体费用,肯定要比java、c/c++要低。

    因为管理类系统可能注重交互,用python做问题不大。python开发web应用还是很给力的。所以,你明白了吗? />

    因为Python是一种代表简单主义思想的语言。阅读一个良好的Python程序就感觉像是在读英语,它使你能专注于解决问题而不是去搞明白语言本身。

    除此之外,Python所拥有的标准库更是很大一部分人选择它的理由。

    它可以帮助处理各种工作,包括正则表达式、文档生成、单元测试、线程、数据库、网页浏览器、CGI、FTP、电子邮件、XML、XML-RPC、HTML、WAV文件、密码系统、GUI(图形用户界面)、Tk和其他与系统有关的操作。

    当你想开始尝试做数据分析的时候,Python无疑会是一个很棒的选择。当

    然,开发软件也是。在Python中,对象既可以赋值给一个变量,也可以作为参数传递给一个函数。以下都是Python中的对象:数字、字符串、列表、元组、集合、字典、函数以及类。

    Python中的函数与普通数学中的函数基本上是一致的——它接收输入数据,对数据进行处理并输出结果。输出的结果完全取决于函数是如何被设计的。另一方面,Python中的类是被设计为输出其他对象的对象的原型。

    以上是我的回答,希望对你有帮助。

    展开全文
  • 1. 开发所需软件python2.7 , wxPython3.0-for-py2.7 , py2exe0.6.9-for-py2.7 , setuptools0.6-for-py2.7注:由于腾讯云的对象存储服务python的sdk使用的是2.7版本,加上python3没有向前兼容,因此这里选择2.7...

    1. 开发所需软件

    python2.7 , wxPython3.0-for-py2.7 , py2exe0.6.9-for-py2.7 , setuptools0.6-for-py2.7

    注:由于腾讯云的对象存储服务python的sdk使用的是2.7版本,加上python3没有向前兼容,因此这里选择2.7版本; wxPython主要是针对python在win下而产生的控件库; py2exe主要是将py文件包装为windows下可执行的exe文件; setuptools主要是用来安装一些第三方python库的时候使用的,当然也可以用pip。上述的软件python版本需要一致。

    2. python环境配置

    在环境变量添加PYTHON_HOME,地址指向Python安装目录,将PYTHON_HOME添加到Path中,并指向Python安装目录的子目录Scripts

    3. 实现需求

    准备工作: 下载对象存储服务Python端SDK,使用pip安装 pip install qcloud_cos_v4

    具体实现:先看看最后的效果图

    界面GUI:

    def setupMenuBar(self):

    self.CreateStatusBar()

    menubar = wx.MenuBar()

    menufile = wx.Menu()

    mnuabout = menufile.Append(wx.ID_ABOUT, u’&关于’, "about this shit’)

    mnuexit = menufile.Append(wx.ID_EXIT, u’&退出’, "end program’)

    menubar.Append(menufile, u’&操作’)

    self.Bind(wx.EVT_MENU, self.onAbout, mnuabout)

    self.Bind(wx.EVT_MENU, self.onExit, mnuexit)

    self.SetMenuBar(menubar)

    def createUI(self):

    panel = wx.Panel(self,-1)

    config_channel=wx.StaticText(panel,-1,u”1.配置apk渠道信息:”,(10,10))

    bt3 = wx.Button(panel,-1,u’一键生成渠道包’,(30,40))

    userLabel=wx.StaticText(panel,-1,u”2.获取云端指定目录下所有apk下载地址:”,(10,90))

    self.userText=wx.TextCtrl(panel,-1,””,(120,120),size=(160,-1))

    #设置默认的插入点,整数索引,开始位置为0

    self.userText.SetInsertionPoint(120)

    inputdic=wx.StaticText(panel,-1,u”输入目录名:”,(30,120))

    bt4 = wx.Button(panel,-1,u’立即获取’,(320,120))

    tv_download_url=wx.StaticText(panel,-1,u”3.生成apk下载地址:”,(10,160))

    tv_show_url=wx.StaticText(panel,-1,u”进度:”,(30,200))

    self.et_url=wx.TextCtrl(panel,-1,””,(90,200),size=(450,-1),style=wx.TE_MULTILINE)

    self.et_url.SetInsertionPoint(90)

    bt3.Bind(wx.EVT_BUTTON,self.createChannelInfo)

    bt4.Bind(wx.EVT_BUTTON,self.createDirectory)

    主要生成了菜单栏操作按钮和主界面一些布局控件,按钮和文本等

    业务逻辑:

    获取apk文件下载地址

    def createDirectory(self,evt):

    self.et_url.SetValue(u’正在生成地址中,请稍后…’)

    #订阅线程回调

    Publisher.subscribe(self.getDirFileListCallback, "getdirfilelist”)

    global apk_dir

    apk_dir = self.userText.GetValue().replace(" ",”)

    GetDirFileListThread(apk_dir)

    #获取指定目录的具体信息,包括所有文件的下载地址

    class GetDirFileListThread(Thread):

    #———————————————————————-

    def __init__(self,arg1):

    "””初始化”””

    Thread.__init__(self)

    self.str1 = arg1

    self.start() # 开启线程

    def run(self):

    # 配置信息从腾讯云后台获取

    cos_client = CosClient(appid, secret_id, secret_key)

    request = ListFolderRequest(bucket, u’/’+self.str1+’/’)

    list_folder_ret = cos_client.list_folder(request)

    s = json.loads(json.dumps(list_folder_ret))

    if s[u’message’] == u’SUCCESS’:

    wx.CallAfter(Publisher.sendMessage, "getdirfilelist”, s)

    else :

    wx.CallAfter(Publisher.sendMessage, "getdirfilelist”, "error:’+s[u’message’])

    #获取目录下文件信息成功与失败的回调,这里仅示范成功回调

    def getDirFileListCallback(self, msg):

    cloud_files = msg.data[u’data’][u’infos’]

    download_url = "./apk_channel/’+apk_dir+’_url.txt’

    if os.path.exists(download_url) :

    os.remove(download_url)

    url_file = open(download_url,’a’)

    # 将获取到的文件下载地址写入文本

    for i in range(0, len(cloud_files)):

    logging.info(cloud_files[i][u’source_url’])

    url_file.write(u”+str(time.strftime("%Y-%m-%d %H:%M:%S’,time.localtime(time.time())))+’ ’+cloud_files[i][u’source_url’]+’ ’)

    self.et_url.SetValue(u’已完成’+str(i+1)+’/’+str(len(cloud_files))+u’,存放于:’+os.getcwdu()+os.sep+’apk_channel’+os.sep+apk_dir+’_url.txt’)

    url_file.close()

    这里并不是直接同步获取下载地址,同步获取容易造成ANR,UI界面卡死,因此采用异步回调的方式,这里使用的是python中的Publisher库配合子线程处理网络请求。Publisher就好比安卓中的EventBus,发布与订阅。

    创建App实例:

    class App(wx.App): # 定义一个带有 OnInit()方法的 wx.App的子类

    def OnInit(self):

    self.frame = MainWindow(None, u’Demo’) # 定义窗口名称

    self.frame.Show()

    self.SetTopWindow(self.frame)

    return True

    #程序入口

    if __name__ == "__main__’:

    app = App()

    app.MainLoop()

    # 程序主入口

    class MainWindow(wx.Frame):

    ”’定义一个窗口类”’

    def __init__(self, parent, title):

    wx.Frame.__init__(self, parent, title=title, size=(600, 600))

    self.setupMenuBar()

    self.Centre()

    self.SetCursor( wx.StockCursor( wx.CURSOR_HAND ) )

    self.icon = wx.Icon("logo.ico’,wx.BITMAP_TYPE_ICO) #设置logo

    self.SetIcon(self.icon)

    self.filepath = ”

    self.filerename = ”

    self.Bind(wx.EVT_CLOSE, self.closewindow)

    self.createUI()

    打包py脚本:

    安装py2exe, 编写setup.py文件,代码如下:

    # coding=utf-8

    import distutils

    import py2exe

    options = {

    "py2exe”: {"packages”: ["wx.lib.pubsub’]}

    }

    distutils.core.setup(windows=[{"script”: "Demo.py”, "icon_resources”: [(1, "start.ico”)] }], options=options , version = "1.0.0”,author = "jeffer’,author_email = "jeffer7150@163.com’)

    保存, 执行该setup.py脚本,即可在该目录下生成dist文件夹,里面即生成了Demo.exe文件。

    展开全文
  • 我的主力编程语言现在是Python,平时也会使用Python写一些小脚本做文件处理(更简单一些的操作会直接用Shell命令)。基本不会接触到GUI界面的编写。但是呢,对于我而言命令行是可行的方案,但是如果要把代码交给没有...

    我的主力编程语言现在是Python,平时也会使用Python写一些小脚本做文件处理(更简单一些的操作会直接用Shell命令)。基本不会接触到GUI界面的编写。但是呢,对于我而言命令行是可行的方案,但是如果要把代码交给没有编程基础的人,并且没有相关的开发环境时。就需要GUI和打包技术了。最近就遇到一个情况需要开发一个类似图片直方图均衡的功能给和课题组合作的医生使用,工作的电脑是离线的,医生没有编程基础。

    要求条件:

    使用Python,快捷开发;

    GUI;

    独立的EXE可执行文件。

    技术栈:

    Numpy,用于对像素数组进行映射;

    Pillow,图像库,底层调用numpy;

    TkinterDND2使用Python内置的Tkinter的改进版,支持基础的code based UI和文件拖拽功能。使用conda安装。

    我的开发环境是OS X,幸好之前一个老师分配的Windows虚拟机还能用。Python环境3.7.3。

    第一版

    77e508114550

    image.png

    支持选取图片文件夹,递归查找其中的jpg文件并处理。

    文件夹选取功能

    77e508114550

    image.png

    图片处理函数

    77e508114550

    image.png

    简单的对图片像素映射到0-255的范围。能够使得标本图片更容易标注。

    恢复函数

    77e508114550

    image.png

    相当于图片处理函数的逆操作,在图片处理的时候保存了每一张图片的处理参数。

    性能分析:

    77e508114550

    image.png

    因为一个标本采集的图片有接近2000张,测试时预估大约需要8分钟才能完成一个标本的图片优化。而费

    使用cProfile进行性能分析,61张图片要18秒多。平均一秒3张图片。主要的时间消耗是在转换成numpy矩阵、保存图片和图片处理函数。基本是不能够再优化的。那么就要从数据量方面考虑,是否每一张图片都需要优化并标注?其实不是的,每一个标本只需要选取最多10张进行标注,那么由医生选取并且拖放到指定界面会更快捷。

    第二版

    77e508114550

    image.png

    第二版添加了拖放功能并且把文件夹选取的功能去掉了。可以拖放多个文件,并且会筛选处理其中的jpg文件。

    PS: 连标题都懒得改。。

    pyinstaller打包

    使用pip 安装pyinstaller打包,pyinstaller是系统依赖的,在什么系统打包,在什么系统使用。坑很多。

    总结

    使用pyinstaller遇到几个bug。six,warm

    打包太大了。有500MB。代码量180行。

    加了Frame之后文件夹输入框就不更新了。可能的原因是pack和grid在frame和widge之间混用。或者混用Tkinter和TkinterDnD2。因为文件夹选取的方案被替换掉了。所以这个bug不再存在。

    conda环境安装耗时较久。

    还是java香。

    展开全文
  • 首先是安装python ,安装完之后将python/bin所在目录添加到path中。2. 安装wxPython, 此时要注意wxPython的版本要与前面python的版本一致。3. 安装py2exe, 这是windows平台下一个非常好的pyt...
  • 如果是商业项目,不建议用Python。不仅仅是效率问题。Python向下兼容极差,Python2.7将于2020年停止官方支持,但基于2.7的活跃项目、新项目仍旧非常多,这些个作者不知道要停止支持了吗?答案是:Python错综复杂的包...
  • 建议此次课程大家稍作了解不要浪费太多时间,因为没有哪家公司会招聘以为Python程序员开发桌面程序吧?开发环境:Python 3.6Pycharm代码界面设置1.导入模块import tkinter as tk2.实例化一个窗体对象root = tk.Tk()3...
  • 192013-10-08 03:48:19 +08:00AAuto编程语言====================================================AAuto是专用于桌面软件快速开发的新一代混合型编程语言,兼具动态、静态语言优势,语法更可兼容大部分流行语言,...
  • Python tkinter 编写的桌面便签软件 完整代码+代码解析 简洁实用,主题丰富,现代化扁平设计
  • 使用 os.rename方法并不难,主要的功能就是应用在对文件的重命名,常规上我们要在桌面上更改文件,直接选中右键点击软件,然后进行重命名即可,这是我们最常见的一种方式,在py里如果想要去更改文件名称,也并不难,...
  • 实例是本人公司真实场景,使用了VNC,ngrok 技术实现内网穿透,本例是对内网穿透的使用; 此例的最终效果是对于处于各地内网终端实现远程桌面监控及操作; 目前世面上也有一些软件实现了内网穿透(向日葵,...
  • Python是支持可视化编程,即编写gui程序,你可以用它来编写自己喜欢的桌面程序。使用wxPython来做界面非常的简单,只是不能像C#一样拖动控件,需要自行写代码布局。在完成编写之后,由于直接的py文件不能再没有安装...
  • 在pycharm中调试好基本配置后,安装py4j,然后找到py4j源文件的位置(一般在anaconda创建的python模拟器中),然后复制这个文件到桌面,并改名为py4j。 安装jdk 这部分网上教程很多,大家按照网上流程安装即可,...
  • 本文实例为大家分享了python实现微信自动回复的具体代码,供大家参考,具体内容如下 新年到了,不想让一早上给你发送祝福的人心里一阵寒风,可以秒回复对方的话,试试下面的python程序可以帮你解决这个问题。 预装:...
  • 我在“python3开发桌面软件之程序主体”一文中已经分享了919网监助手1.0程序的主体源代码(即events.py中的代码),后用迭代器、生成器表达式等对代码进行优化,使程序运行更快、更稳定。优化后的代码如下: #coding...
  • 标准对话框在软件设计过程中是经常需要使用的。 αt提供的标准对话框除了本实例提到的,还有 QErrorMessage, QInputDialog, QMessage Box, QPrintDialog, QProcess Dialog等,这些标准对话框的使用在本书的后续 部分将...
  • 使用ISIC-Downloader文件加中的脚本下载数据集: python download_archive.py -s ...cd C:\Users\Administrator\Desktop\程序及软件说明书\ISIC-Downloader 会显示没有tqdm: 3、安装tqdm 输入命令: p
  • 第10章 开源软件桌面应用 10.1 GNOME 10.2 OpenOffice.org 10.3 Emacs 10.4 Firefox 10.5 Thunderbird 10.6 GIMP 10.7 FreeMind 10.8 7-Zip 第3篇 参与开源项目 第11章 开源社区的基础设施 11.1 基础设施 11.1.1 ...
  • 开源软件之道.part2of2

    2012-04-29 18:00:11
    第10章 开源软件桌面应用 139 10.1 gnome 139 10.2 openoffice.org 142 10.3 emacs 145 10.4 firefox 147 10.5 thunderbird 150 10.6 gimp 151 10.7 freemind 152 10.8 7-zip 154 第3篇 参与开源项目 第11章 开源...
  • 最重要的是还全面介绍了如何利用原生的C/C++(NDK)和Python、Lua等脚本语言(Android Scripting Environment)来开发Android应用;本书实战性强,书中的每个知识点都有配精心设计的示例,尤为值得一提的是,它还以...
  • CVE-2019-13051-Pi-Hole路由端去广告软件的命令注入&权限提升 D-Link DIR-859 - RCE UnAutenticated (CVE-2019–17621) Huawei HG255 Directory Traversal[目录穿越]|本地备份文件 D-Link Devices - ...
  • Android应用开发揭秘--详细书签版

    热门讨论 2012-12-12 13:27:46
    传奇》、《养成计划》等游戏的开发,22007年荣获中国软件行业协会游戏软件分会(CGIA)认证及国际游戏开发教育联合会国际认证. 目录 封面 -11 封底 -10 扉页 -9 本书赞誉 -8 前言 -7 目录 -4 第一部分 准备篇 1 第1...
  • 最重要的是还全面介绍了如何利用原生的C,C++(NDK)和Python、Lua等脚本语言(AndroidScriptingEnvironment)来开发Android应用,《Android应用开发揭秘》实战性强,书中的每个知识点都有配精心设计的示例,尤为...
  • RED HAT LINUX 6大全

    热门讨论 2011-10-21 18:46:06
    5.4.7 控制光标在桌面上的移动 78 5.5 fvwm2的AnotherLevel配置特性 79 5.5.1 重要的文件 79 5.5.2 配置AnotherLevel 79 5.5.3 键盘控制 80 5.6 AfterStep窗口管理器特性 81 5.6.1 重要的文件 81 5.6.2 配置After...
  • 国内桌面用户 Deepin 15.9+ (内置QQ、微信、WPS方便出题人本地测试,最新15.11测试通过) wget http://dl.hustoj.com/install-deepin15.9.sh sudo bash install-deepin15.9.sh 基于 CentOS 安装 假如你不得已非要用...
  • 微软办公软件 自然语言处理 网络:与网络各层配合使用的库 视频:用于处理视频的库 其他 常用包 常用包 说明 fmt 实现格式化的输入输出操作,其中的fmt.Printf()和fmt.Println()是开发者使用最为...
  • 精通Qt4编程(第二版)源代码

    热门讨论 2014-01-19 13:07:18
    另外,还有一些开源的在其他语言上的Qt绑定,如C#/Mono的绑定Qyoto,Python的绑定PyQt,Ruby的绑定QtRuby等。有了这些产品,编写Qt程序不再是C++程序员的专利了。 \Qt的发行版本有商业版和开源版。开源版遵循QPL(Q...

空空如也

空空如也

1 2
收藏数 31
精华内容 12
关键字:

python桌面软件实例

python 订阅