Python打包为exe——pyinstaller

2021/6/16 14:51:07

本文主要是介绍Python打包为exe——pyinstaller,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

文章目录

  • 简介
  • 安装
  • 初试
  • 进一步压缩
  • 打包GUI
  • 图标
  • 参数
  • 打包PyQt5
  • TODO:打包OpenCV
  • TODO:打包TensorFlow
  • TODO:函数变命令
  • 遇到的坑
  • 参考文献

简介

将 Python 程序打包为可执行文件 .exe

可以使用 pyinstaller,也可以使用 Nuitka

本文主要介绍 Windows 下使用 pyinstaller




安装

为避免打包的文件过大,使用虚拟环境控制包




安装 Windows 下的虚拟环境管理包 virtualenvwrapper-win

pip install virtualenvwrapper-win

新建虚拟环境,默认存在 C:\Users\Administrator\Envs

mkvirtualenv test

PyCharm 配置

File → Settings → Project: xxx → Python Interpreter → 设置的图标 → Add → System Interpreter → 选择 C:\Users\Administrator\Envs\test\Scripts\python.exe → OK(可在Show All中改名)

在这里插入图片描述

进入虚拟环境

workon test

安装打包工具

pip install pyinstaller




初试

1.py

print('Hello World!')
input()

打包

pyinstaller -F 1.py

运行 dist 文件夹里的 1.exe,大小仅有 5.9 MB
在这里插入图片描述




进一步压缩

本文使用UPX 3.96

UPX 是一款免费、可移植、可扩展、高性能的可执行文件打包器

使用 UPX 进行进一步压缩

下载 upx-x.xx-win64.zip ,将 upx.exe 解压到同一文件夹,也可使用 --upx-dir=xxx 指定路径

执行打包命令

pyinstaller -F 1.py

效果
在这里插入图片描述




打包GUI

使用中国天气网的API编写一个查询天气的应用

更新 requests 包,否则 报错 ModuleNotFountError: No module named 'requests'

pip install requests --upgrade

2.py

import requests
import tkinter as tk
from tkinter import ttk
from tkinter import scrolledtext

cities = {
    '澳门': 101330101, '北京': 101010100, '长春': 101060101, '长沙': 101250101, '成都': 101270101, '重庆': 101040100,
    '福州': 101230101, '广州': 101280101, '贵阳': 101260101, '哈尔滨': 101050101, '海口': 101310101, '杭州': 101210101,
    '合肥': 101220101, '呼和浩特': 101080101, '济南': 101120101, '昆明': 101290101, '拉萨': 101140101, '兰州': 101160101,
    '南昌': 101240101, '南京': 101190101, '南宁': 101300101, '上海': 101020100, '沈阳': 101070101, '石家庄': 101090101,
    '台北': 101340101, '太原': 101100101, '天津': 101030100, '乌鲁木齐': 101130101, '武汉': 101200101, '西安': 101110101,
    '西宁': 101150101, '香港': 101320101, '银川': 101170101, '郑州': 101180101
}


def get_weather(city):
    """获取天气"""
    url = 'http://wthrcdn.etouch.cn/weather_mini?citykey={}'.format(city)
    res = requests.get(url)
    data = res.json()
    if data['status'] == 1002:
        return data['desc']
    data = data['data']
    result = '{}天气预报\n'.format(data['city'])
    result += '实时温度:{}℃\n'.format(data['wendu'])
    for forecast in data['forecast']:
        result += '{}:'.format(forecast['date'])
        weather = '{} ~ {}'.format(forecast['low'].replace('低温 ', '').replace('℃', ''),
                                   forecast['high'].replace('高温 ', ''))
        result += '{} {}\n'.format(weather, forecast['type'])
    result += '{}'.format(data['ganmao'])
    return result


def command():
    weather = get_weather(cities[city.get()])
    scr.configure(state=tk.NORMAL)
    scr.delete(1.0, tk.END)
    scr.insert(tk.END, weather)
    scr.configure(state=tk.DISABLED)


win = tk.Tk()
win.title('查询省会城市天气')
frame1 = tk.Frame(win)
frame1.pack(fill=tk.X)
city = tk.StringVar()
city_chosen = ttk.Combobox(frame1, width=12, textvariable=city, state='readonly', font=('微软雅黑', 11))
city_chosen['values'] = list(cities.keys())
city_chosen.current(0)
city_chosen.pack(side=tk.LEFT, fill=tk.X, expand=True, padx=5, pady=5)
button = tk.Button(frame1, text='查询', command=command, font=('微软雅黑', 11))
button.pack(side=tk.LEFT, padx=5, pady=5)
frame2 = tk.Frame(win)
frame2.pack(fill=tk.BOTH, expand=True)
scr = scrolledtext.ScrolledText(frame2, wrap=tk.WORD, state=tk.DISABLED, font=('微软雅黑', 11))
scr.pack(fill=tk.BOTH, pady=5, padx=5, expand=True)
win.geometry('600x300+300+300')
win.minsize(200, 200)
win.mainloop()

效果
在这里插入图片描述
-w 不带控制台打包

pyinstaller -F -w 2.py

注意!MacOS无法直接使用tkinter




图标

使用 在线图片转icon 或 在阿里巴巴矢量图标库

带图标打包, -i 指定图标

pyinstaller -F -i 1.ico 1.py

效果
在这里插入图片描述




参数

详细查阅:pyinstaller 参数

打包:pyinstaller -F 1.py

不带控制台打包:pyinstaller -F -w 1.py

指定图标且不带控制台打包:pyinstaller -F -w -i 1.ico 1.py




打包PyQt5

本文PyQt5==5.15.4

安装

pip install pyqt5

weather.png 需自行转换为 weather.icon
在这里插入图片描述
qrc_rc.py

from PyQt5 import QtCore

qt_resource_data = b'\x00\x00\'\xdd\x00\x00\x01\x00\x01\x00\x00\x00\x00\x00\x01\x00 \x00\xc7\'\x00\x00\x16\x00\x00\x00\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x00\x00\x01\x00\x00\x00\x01\x00\x08\x06\x00\x00\x00\\r\xa8f\x00\x00\'\x8eIDATx\xda\xed\x9dy\xbc$U\x95\xe7\x7f\xe7Fd\xbe\xad\xea\xd5[\x0b\x8b\xb5\n\xa8\xa2VJ\x16\x91f\x13l?\x0c\x8akK\xabc\xe3\xd6*\x1f\xc7\xcf\xc0\xb4\xe3|\xc6V\x1b\x9bQ\x9c\xb6\x1d\xa7\xa7\xdb\xa5[\xa6G\xc5O\x8b\x0b\xd0\x82\xad|\x10\x1d\xa4\x14\xa5\x1d\x01\xb5\xa1V\n(\x8ab\xa9*\xeam\xf9^\xbe\xcc\x97\x11\xf7\x9e\xf9#"\xdfVo\xc9%"nd\xe6\xf9\xf2)\xa1\xd2\xcc{\xcf\x8d\x88s\xe2\xdcs\xcf=\x17\x10\x04A\x10\x04A\x10\x04A\x10\x04A\x10\x04A\x10\x04A\x10\x04A\x10\x04A\x10\x04A\x10\x04A\x10\x04A\x10\x04A\x10\x04A\x10\x04A\x10\x04A\x10\x04A\x10\x04A\x10\x04A\x10\x04A\x10\x04A\x10\x04!Q\xc8\xb6\x00Bk\xc3{\xcf:\x11\x9a\xcf\x009\xdd`\xd3\tE\x9dP\xce\nh\xb5\x02\xca\xed\x02\x14@n\x01\x8c\x02X\x15\xe0\x9a<t)\x07S<\x8a\x8e\xc2^Z\xf7\xcc\xa8\xed142b\x00\x84D\xe0\xfdg\x0e\xc2t\\\x0c\xb4m\x07\xbb[\xa0\x9c\xf5\x80Z\x0fP\xa0\xe4 @)\x80\xaby$}@\xeba(\xde\x0f6\xfba\xcc\x1e\xb0\xf97\x98\x89\x9f\xd3\xd6\xdd\x13\xb6\xc7\xdc\x08\x88\x01\x10b\x81\xf7l\\\x0b\xb5\xeaJ\x90s9\x8cs\x11\x94{\x1a\xc8\x99\xf9\x029\x00\x1c\x00\nL\xa1\x01\x80\x03\x02\xc00 b\x80\r\xc0\x0c\x80\x01\xf6\x01\xe8\n;7\x06\xc4{a\xf4\xbf\x82\xbc\x9f\xa1\xed\xf9{\xe9\xb4gGl_\x934"\x06@\x88\x0c~\xfa\x82K\xe1e>\x00\xa5^\x0b\xca\x0e\x82\t \x07\x8c,@m \x95\x01\x93\x0b\xc0\xad\xb1\x07\x03\x82\x0ff\x1fd<\x00>\xc0^\xf0gi\xc9\x00\xed=\x01\xf2\x7f\x04*}\x856<\xf2\xb4\xedk\x95\x16\xc4\x00\x08u\xc1/\\|*\xf2\x99\x0f\x83\xd5\xdbA\xceZ\xa86\x00Y\xb0\xca\x02\x94E\xf0\x96\x8f\x17\xe2"\xd8\x14@<\x19x\r\xcb\xa1\xbd\xdfB\xe9o\xc2\xbc\xf4\r\xda\xb8o\xdc\xf65\xb4\x89\x18\x00\xa1&x\xffE\xef\x02g>\x0cj\xbb\x90U;Hu\x80\xa9\x1d\xc1|\xde\x1e\x811\x98\x04\x99I\x00\xbc\xcc \x0c\xc0\xe6\x07p\xf8\xef\xe8\xcc\x9f?`UpK\x88\x01\x10*\x86\x19.\x9ex\xe5u@\xf7\x7few\xc5iP\x1d\x00\xb5\xd9\x16k\x114\xc8\xe4\x00]i,\xd0<\nS\xb8\x99\xce\xfa\xd7\xbbmK\x9e$b\x00\x84e\xe1C\'w \xbf\xfaz8=\x1f\x853\xb0\x9aU\x97m\x91\xaa\xc0\x0f\rA\xbe\xc2\xef{{\xa0\'\xff;\xcez\xf8\xdbD\xa8`>\xd1\xd8\x88\x01\x10\x16\x85\x19\x84=g\xff)\x9c\x81\xbf\xe6\xec\xea~P\x87m\x91\xea\x18\xcc\x14\xc8\x1fB\xe5+\t\xc5\xfd\xe0\xdc\xfb\xe9\xac\xc7\x1e\xb4-z\x9c\x88\x01\x10\x16\x84\x9f\xd8\xfcr\xd0\x9a\xdb83\xb8\x19h`\xc5\x9f3(\r\xd2\xc7\x00.U\xf8\x03\x03\xe8\xfc\xdd0\xb9\x0f\xd3\xe6=/\xda\x16?\x0e\xc4\x00\x08s\xe0]\x9b\xfb\x8c\xdb\xf7e\x959\xf1\x1d\xac\xba\x9a\xf0\xf9`@\x8f\x80L\xa5S\x02\x00\xec\x17\xa0\xf3\xff\x03\x1b\x1f\xbe\x99\x08\xcb\xad96\x14Mx\x83\x85Z`\x86\x83=[\xaegw\xcdg\x90=i\x85\xedh~\xec\x98\t\x90\xae27H\x17\x9f\x05r\xd7\xd3\xc6\xc7\xfe\xc5\xb6\xf8Q!\x06@\x00?\xbd\xee\x04L\xf5\xde\xc3\xd9\xb5\xe7\xc1Ye[\x9c\xe4\xf0\x87\x82\xdc\x81\xaa0\x80?v\'t\xe1Oh\xeb\xeeJ\xe7\x12\xa9E\x0c@\x8b\xc3\xbb7]\x06\xd5s\x17\xb7\xad\xed\x03\xb5\xdb\x16\'\xe1\xc13\xe0\x1f\x06\xc1\xaf\xfe\xb7\xa6\xb0\x0f\x94{\x1dmx\xbc\xa1\xb3\n\x9b\xdc\xcf\x13\x16\x83\x19\xc4{6~\nn\xff\x03\xdcvz\xeb)?\x00\x10\x01n_m\xbfU\x1dg\x01\x03\x8f\xf1\xfe\x0b\xfe\xd8\xf60\xea\xba\x04\xb6\x05\x10\x92\x87\x19.vo\xf9gd\x06\xdf\xc8\x99\x93\x01\xca\xd8\x16\xc9*\xa4\x8f\x01\xa6P{\x03\xec\x7f\x966\xec\xf8\x0b\xdb\xe3\xa8i\xec\xb6\x05\x10\x92\x85\x0f\x9d\xdc\x81\xf1U\xf7!\xb3\xe6Rv\xd7\x00T\xeb\xc6\x9c\xe6\x81\xcc$\xa0\x87\xeak\x84\xf5m\xb4\xe1\x81km\x8f\xa5\xea\xb1\xdb\x16@H\x0e>xj/\xf2\xabv\xc0\x1d8\x9b3\'\xb5\xfc\x9b\x7f\x06\x06y\xcfc\xd9\xbd\x03\xcb\xa2~\x0c8o\xa6\xf5\xf7N\xd9\x1eQ\xc5\x12\xdb\x16@H\x06\xde\xb7\xe1$L\xf6>\x02w\xf0l\xb8\xfd\xa2\xfcs @E\x11\x031W\x01z\x07\x1f|g\xaf\xed\x11U\x8a\x18\x80\x16\x80\xf7l\xdc\x00\xd3\xf9(\xdc\x81\xd3Yu\x82\xd5J\xdb"\xa5\x90\xa8\x0c\xa2\xb9\x10\xde\xd0\x83\xfc\xd4\xbbN\xb5=\xa2J\x10\x03\xd0\xe4\xf0\xeeMk\x80\xb6\x1dp\xfaO\x00\x1c\xc0\xa91\xea\xdd\xe4p\xdd\xee\xff\xec\xc6\xf4\x16\x98\x97\xee\xe5\x17>:`{\\\xcb!\x06\xa0\x89\xe1]\x9b\xfb\x00\xf7\x17p\x07\xd6\x80\x08\xc1\xf6\xdd\xf8\x0bt4"\x14\xa5\x01\x00\x00\xf8\x9b\x91\xdf\xfdC\x1e\xba\xa9\xdb\xf6\xd8\x96B\x0c@\x93\xc2\x87N\xee\x00\xb9;\x90\x19<\xb3\x1c\xebe\xea\xb4-V\x8b\xe1]\x88\x91\x87\xbf\xc7/\xdc\x92\xda\x0b/\x06\xa0\ta\x86\x83\x89\x9e\x1f#\xd3\xbf\xad|\x8b\x19nD\x81\xae&\xa5\xe2\x1d\x82\xd5\xb6;u\x15\x8a\xf7\xfc\x03\x1f\xfa\x9bTn\xa9\x14\x03\xd0\x8c\xec\xd9t;T\xffe\xb3\xeb\xf1\x91J\xedK(\x05\xe8\xf8\x0c\x00\x00\xe8\xc9w\xa3\xf4\xe0\xa7l\x8fr!\xc4\x004\x19\xbck\xe3\xc7\xe1\xf4\xff\x11\xd4\xdc\xa86\xcb\xb2\xdf\xa2\x04\xf5\x03cF\x0f}\x8cwm\xb8\xd4\xf6X\xe7#\x06\xa0\x89\xe0}\x1b\xb6\xc3\xe9\xfe\xb4\xb8\xfaU\xa2\x930\x00y\x02\x9c\xdb\xf9\xc0\xda\x1e\xdb\xc3\x9d\x8d\x18\x80&\x81wn^\x01\xdd\xf9/p\xba\x17\xcc\xed%\x92[\xbd \xec\x03\x88yW/\x97\x00\x9e\x04\x08/C\xa1\xfd[\xb6\x87<\x1by*\x9a\x05\xa5\xfe\tn\xef\xa2\xc9\'\x1c\xf5*W\x93@\xf5\xee\x01X\x0ef\xc0\x9f]x\x84\xae\xe6]\x1b\xaf\xb7=\xee2b\x00\x9a\x00\xde\xbd\xe9\xddp{\xde\xbc\xf4\x1a\xbfl\xfb8\x0e\x9d\x8b7\xf8\x07\x00f\x148\xae\xde\x00}\x81wm\xdeb{\xf8\x80\x18\x80\x86\x87\xf7l\xec\x87j\xff\xcar\xfb\xf9\x89[\xfa\x00\x9c\xe3a\x0fd\xc6\xe2\xed\xc3L\x06\x7f\xe6C\xc8\x02\x9c\x8a\xa9\x80\x18\x80\x86\xc7\xf9\x02T\xef\x8a\xe5\xbe\xc5\xa6\x88\xfaw\xbb5\x0b\x9c\x80\xeb_\x00\x96\xaa9Hx9\xef\xd9x\x9d\xed+!~a\x03\xc3{6n\x03\xf5?\x06\xa7\xc2\x1c\x13w0<\xbe\xab\x95a\x90\x7f\x0c\xe0b\x8c]\x14\x00\x7f\xb8\x12QF\xd0Y8\x9d\xd6=3j\xebj\x88\x07\xd0\xc8p\xe77+V~\x00\xaccvy\xd3\x0e\x1b\xc0\x7f)\x1d\xca\x0f\x00\x84^\x14:>k\xf3\x92\x88\x01hPx\xd7\xe6?\x85\xbb\xea\x9cj~C\\\x02L\xa5g\xe55\x1b\x06\xa4\x8f\x828\xc6Z\x1df\xb2r\xe5\x9f\x86\xff\x03\xef\xdb\xb0\xdd\xd6U\x11\x03\xd0\x800\xc3A\xa6\xfb\xafj\xd9\xd9Gz4\\\xfbn!X\x83\xfc#\x00\xc7x\xa6\x87\x99\\z\xce\xbf(D\xd0\xca\x9a\x17 \x06\xa0\x11\xd9\xb5\xe5}\xa0\xae\xd5\xb5\xfd\x98\xeb\xaf\x7f\xd7@\x90\x19\x03\xf9/\xc6h\xf4\x180\xb9\x1a\x95\x7fZ\xca\xaby\xcf\xc6m6\xae\x8f\x18\x80F\xc4\xed\xfed=\xf1[\xe2\x12\xe0\x1fCS\xaf\n\xb0\x07\xf2\x0f\x07k\xfd\xb1\x8d\x93\x01=\x0c\xe8\x08\x96X\r>\x96\xe4\xe5)#\xab\x00\r\x06\xef\xdb\xfev\xd0\xc0wA\xf5\xdf:\xa6\x0c\xe0\x0e\x00h\xae\xca\xc0d\xc6B\xa5\x8c\xd1\xc0\xb1\x01\xf4\xb1\x08\xa7\x15l@8\x836\xed}&\x81K4\x8dx\x00\r\xc7\x8a\x1b\xa3P~\x00 \xf6\x00\xef\x08\x10g`,1\x18\xd0\x13 \xff\x85\x98\xdf\xfa\x08\xa6\x13\xfe\xd1\x88c\n\xa4\xc0\xf8/q_\xa5\xe3zM\xbaC\xa1v\xf8\xf1\xadW\xa2\xfd\x84\xfb\xe2\xb8m\xac:\x11\x9c\x0b\xd8h\xde\x80\t\x0e\xfa4\x13\x00\xeb\xf8\xbb\xe3)\xc0\x1fB,\x06\x86QB\xd6;\x99\xd6?\xf9R\xfc\x03\t\x10\x0f\xa0\x91\xc8\xac\xf8\xb3\xb8l6\x99I\x90\xf7b\x98$\xd3\x08g^j\x90\x1e\x03y/\x80\xf4X\x02\xca\xcf\x80\x19\x8f7vB\xc8\xa2\xe4~ \xe6\x81\xcc\xebRh\x08\xf8\xa9\xd3W\xc1?\xf5\x18\x94\x9b\xcc+Zu\x065\x04U;R\xf3\x98\xb0\x0f\xe2B\xb0\xe4\x96\xa4\x91b\x1d\x04\xfb\x92\xe9s\x17m\xde\xb35\xa9\xa1\x89\x07\xd0(\xe8\xc1\xf7&\xa6\xfc\x00`&A\xfa\x18\xc8{\x1e\xa4_\x02\xf4\x04\x80\x04\\\xec\xe3\xf0\x83e6\xefp\xb0\x9c\xa7G\x93U~=\x19\xce\xf7\x13\xebs\x0b\xef\xda\\U\x82W=4\xda\x84\xafu1\xd9w\xc1JEo\x06L\x11\x84"`F\xc0\xc8\x80\x9c,\x80,\x98\xb2\xe1\tCQy\x08>`JAp\x92K\x00JA\xb4\xdd\n&X\xdb71\xa6\r/\xde\xf7\x9f\x00\xf8]\x12=\xa5\xc4\xb7\x13\x96\x82\xf7\x9es"T\xdf\xf3QE\xff#\x872\x00e\xc2\xba\x83\x0e\x02\xc7r\t\xe7\x92\x18\xc4>\xc0\x1a\x0c?\xfc\xef\x14\xc5\x1d\xb8\x18\x16\xf1\xb0`|\x98\x01\x0f/\xd1\xcb\xf7\xd6\x98\xe8U\x1d\xe2\x014\x02\xd4y}j\x95\x1f\x08\x96\xc3\xd8\xab\xe9m\x92\xaaQ\xb1\x01\xcc\xd8\xc2{\xf8\x13\xe9\x9f\xc3\xda!4\xc8\x8fo\xbc\x92\xb6\xed\xfdI\xdc]J\x0c\xa0\x11\xa0\xcc\xebm\x8b\xd0\xf4\xf0\x14\xe0\x1f\xb1\xa8\xfc\x00<\x0284\x89\x86\xdf\x94D\xb7\xe2\x01\xa4\x1c>\xbay\x05\xc6\x9cT\x94\x8fjN\x18\xd0c\x80\xc9\xdb\x13Ac\xa1\xf8\xea\x15It\x9d*\x0f\xacY\x19)\xf0Z.a\x93"lc\xc6)J\xa1\xd70V\x11\xa1\x9b\x11\xfc\x1b\x8cn\x02\xfa\xc3\x9f\x1cc \xc7@\xce\xe1\xa1\xacS\xda\xbf\x99\xf4\x04\x88\xc7A\xe6(\x1c\xef\x19(}\x10J\'\x96/\xd2\x9c\xf0T8\xd7\xb7\xb1\xba\x11b\xa6\xdd\xfe\xb9\x9f\x13\x80\x9e|\x1f\x9d\xf6l=\xbb\x8c\x96E\x0c@\x84\x8c\x8d\xf1\x99>\xe3<\x87\xb0\x8d\t\x9b\x89\xb0\x9e\x803Ah\x8f\xfaB3\x00\x98)(\xfd"\x94\xff\x1c\x1c\xfd\x1c\x94\x7f\x00Ni\'\x94>j\xfbR\xa4\x1c\x1d\xa4\x0b\xdbr\xf7g\x89\xb1\xa4\xedq\xbc\xb7\xd3\xb6\'o\x8fS\x04\x99\x02\xd4\xc1\xd0$\x9f\xac|\xfc!\x11\xae\x04\xe3U \x9c\xe4R2V\x95\x00@\xb5\x81\xd5Z\xe8\xcc\xda\xe9\xe7\x88\x01\x90\x7f\x14n\xe918S\x8f"S\xfa-\xc8T[\xa4\xa2Y\xe1p\xdf\xfe\x18\xac\xef\x84\xf4\x190\xcb=)\xee\xab\x01\xc4j\x00\xc4\x03\xa8\x02f^9\x92\xc3\x9b\x1c\xc2\x95\xacp\t1\xd6\xa598\x1f\xc8\x0c\x90\xff<\x9c\xd2\xbf!Sz\x18\x99\xa9\x87\x9bd\xf3O\xb5\x17\xc2\x0b\xd6\xf5\xe3,\nR)\x1e*\xb3?\xc4{i\xfb\xdeMq\x8a\x92\xf2\xc7\xd7>\xcc\xec\x8e\x8e\xe3\r\x0e\xe1\xbd\x06\xb8J\x11\xb2\xb6e\xaay,\x00XO\xc1\x9dz\x08m\x85\xfb\xe0\x96~\x0b\xebo\xc2\xd81\x80\x9f\x03\xd8b\x90\xaf\x0c#P\xfeJ!\x06\x1c\xd5F[w\xc7\x96$!\x06`\x11\xc6\xc6\xf8Bv\xf0\x01b\xbc\x85\x08}\xb6\xe5\x89\x1af\x80\xfdQd\x0b\xf7#[\xfa)\x1c\xef)\xdb"E=\xc2 }\xd9L\xc0JB\xcf|\x0c\x8e?\x1f\xa4\x12\\\xff\x1c\xda\xba\xff\xf7q\x89%\x06`\x16#\xcc=\xc8\xe1?\x93\x83\xf7(\xe0\xd4\xfa[L?\x0c\xc0\x18\x80\xbcCh+\xde\x83\xf6\xe2=\x96\xd2_#\x1c\x91)\x86\xf3|\x8b\xd1\xfd\xd9,\x17\xec[\n\x97\xdfI[\xf7~\'.\xd1$\x08\x08\xa0P\xe0\xd3<\x1f\x1f7\x13x\x97r\xd0i[\x9e$!\x00\x8e\x028{\n\x8a\x99\x0f\xa1\xd8y-\xda\nw\xa1\xbdp\x17\xc84\xd8iB<\x15(~\x1a\xe6\xf9e|\xd4\xeb\x80l\x8cS\xbc\x96\xf6\x00rS\xbc\x91=|\n\x8ck\x88\x90\xb1-O\x1a0\x1cx\x04\xe0)\xb4\x15\xeeA{\xe1\xce\xf4\xe7\x1b\xf0T2\xe7\xfcU%\x13\x02\xe5\xaf7\xc4B\xfa{\xb4\xfd\x89w\xc4%fK\x1a\x80\xd1<\x9fG\x8c\x9b\x00\xbc\x8e$\x1d\xfa8\x98\x03C\xc0\x0c\x80}d\x8b\xf7\xa3\xa3\xf0=(\xff\x90m\xd1\xe6\tZ\n\x15?e\xab\x1a\x06\x80\xe6\x99\xb4\xdez \xf3{\xda\xbe/\xb6\xed\xc1-e\x00&\'\xf9\xe4\x92\xc6\x97\x14\xe1\xcd\xb6eI;s\x8c@\xf0\t\xda\n\xf7\xa0#\xffu\xfbS\x03\xf6\xc3M;)\x8cU\x18\x06\xfc\x88\xd4\xca\x00\xf0\xb4G\xaf|"\xb6\x95\xa7\x960\x00\xcc\xdc9^\xc0\x8dF\xe3\x06E\xad5\xc7\xaf\x97\xe9)A\x08\x99qt\xe4oE[\xe1\x87H|\t\x915\xc0c\x80.\xd8\xbe,\x0b\xe3E\xf4\xd6\x07\x82\xa0\xe1\x14\x82\xa5\xc0\x95j%m\xdd\x1d\xcb\x91NMo\x00\xc6\'\xf9\xad\x86\xf17\xc4\xad\x11\xd5\x8f\x83\xf9F\x00\x00\x94\xff\x0c\xbar\xff\x13\xae\xbf7~\x01X\x07\xf5\xf8ln\xd8YR>D3\xdf/c\x00\x14\x18\xc1\x16p\x06V{\'\xd0\x99O\xc5\x92\xdf\xdd\xb4\x06`\xb4\xc8g\x90\x8f\xaf\x12\xf0\x1a\xdb\xb24\x03\xda\xcc\x9e\x0e\xcc\x90-\xfe\x0c\x9d\xf9[@:\x8et\xe3\xa0\xe2oP\x8e,\xa5\tKQ\xce\xf7\xcb\xed\x15\x19\xd3\xaaI\x0ct\xf2\xe9\xb4}\xdf\x818\xc4o\xca\x00\xd8\xd88\x7f\x18\x1e\x1e\x17\xe5\x8f\x0eEX\xb0&I\xa9\xfd\xd5\x18\xed\xbd\x15\xa5\xecE\xd1u\xc6\xe1f\x1d\xefH\xfc\x07|\xd4\x83\xe6 \xa7?*\xe5g\xccU\xfe2\xa5\xc9\xae\xb8\x86\xd0T\x06\x80\x99;\xc7&\xf8\x87D\xf8\x8a"T~n\xb6\xb0,DA\xbe\xc0\x82\xa8\x0e\xe4{\xfe\x1b&W\xfe\xa7\xb0F`\x8dp)8]\xd7?\x1c\xb8\xfci\xc8\xe0[\x0c\x8f\x01M\x88\xcc\x896\x1c\xb8\xfd\xf3\xdbc\x00YG\x0c\xc0r\x8c\xe4\xf9\x9c\xb1<\xf6\x12 \xd5sbD-\xf1\xbcOu\xbc\x1ec\xbd\x7f\x0f\xed\xac\xa9\xaeQ\x93\x0f\xaa\xf1\xf8/\x01\x9c\xd2\x00_\x99r>\x7fTo\xfd2S\xc0\xc2\xc6\x84\x00vb\x0b\\7\x85\x01\x18\xc9\xf1G\x15\xe3\xd7\n8\xc5\xb6,\xcd\xcer\xbb\x1f\x8d\xbb\x16\xb9\xbe\xff\x8dR\xdbe\xcb\xb4\xa4\xc3r\xdf/\x84\xa5\xbe\x1b\xe0\xc8r\x8d\xd0\xe5\x8f\xb8\xdd\xc2R\xd3\x08\x06L6\xb6z\xd0\r\x9d\n<\xc4\xdcM9\xdc\xa1\x14\xael\xdahf\xca \n\xbc\x00\xb3\x94\x12P;\xf2\xabn\x84W\xf8\t\xba&\xbe87Q\x87\xa7\x82\xc0^\x1a\xd7\xf0\x97b:\xa57\xe2\'\xad\x88\xa5\xbd\t"@\x15sq\r\xaba\r\xc0\xc4\x04\xbf\xcc\x1b\xc7CJa\x9d(\x7f\xb2(\x15\x14\xd0\xe5e\xde\x84\xa5\x8e+\xe1g\xd6c\xe5\xd0\xf5P\xe6p\xe0\xde/\xf7\xa3\xb4\x11\xf5\x12\xdfl\x8a\x95\x14\x05a@ql\x06\xa0!\xa7\x00\xa3\xa3|\x86\xcfxDQ\xfa\x0br\xb4:\xc6]\x87\xf1\xfe\xaf\xc0Pw\xe3)\xbf\xe1\xca\x8bwT\xcbT%\xca\x8f@C\xd9\x8d%\t\xa8\xdc|C12\xc1/g\x85\xdf\x10p\x92(\xbf=\xaa\xb9\xf6\xc6=\r\xb9\xc1\xefA\xbb\xebl\x8b]9>\xa2K\xe9\x9d\xcfTy\x05\xa1B\n\xc3\xe2\x01\x00\xc0P\x8e/b\x8d_*B\x9f(\xbf]\xaa\xbd\xfe\xec\x0cb|\xf0;\xf03\xb1\xeen\xad\x1f\x03\xa0\x84\xf8V \xabU~\x00t\xa1\x18\x00\x0c\x8f\xf1\xd5\xc4\xf8\x99\xe3\xa0K\x94\xdf>\xb5\xdc\x02V\xdd\x18\x1f\xf8\x16\xbc\xec\x05\xb6\xc5_\x98\xe9\x12\xdd11\x85\xaa\x95\x1f\x84X+\xba6\x84\x01\x18\x1d\xe7k\x00\xfc\xc8Qh\x13\xddopT\'&\x06o\x85\xd7~\x89mIf(\x07\xfa\xe2r\xf9\x81\xf0\xcd_\xc3\xef\x1c~:\xce\xa1\xa7\xde\x00\x0c\xe5\xf8\x0f\x8c\xc1mD\xd5\xbb\x9dB\xbc\xd4s;&\xfa\xbe\x04?\xb3\xcd\xf6\x10\xc2-\xb7\x887\xe9\xb0\x06\xb7\x7fF>\x1dk\xb1\xc6T\x1b\x80\xe1\t>\x1b\x06\xf7\x01\xc8:\xa9\x96T\xa8\x1aj\xc3\xc4\xc0?B\xbbk\xed\xc9PN\xec\x89\x93Z\xdc\xfei\x18\xc8d\x9e\x88S\xbc\xd4\xaa\xd5h\x81\xd7A\xe3gDX\xa9\xe4\xcd\x9fJ\xeaU\x9d &p+\x8c\x1aL^p\x0f\xa1K\x1e\xe3\xc3U\xac\xd1\xed/C\x00\xa0\xf7\xc7y)Ri\x00\xc6\xc7y\xd0L\xe1\xe7\x00\xfa\tA\xe2\x89\x90>\xa2P\x1dvV\x07F\x80V&#\xb4\xe6\xb0pG\x8c}\x94w\xf5U\xb2\xce\xbf\x14\x04\x80J\xad\xe5\x010\xf3\n\xcf\xe0\x01P\x90\xd7/\xf3\xfet\xc2\x88\xb0\xfeEf\x1d&\x06\xfe\x11\x1c\xe7\x99+\xd3o\xfd\x08w\xf0-F\xa5I>\xcb\xe1\x008\xa1\xb03NQSg\x00Fr\xb8\x03\xc0\xf4q\xd8b\x00\xd2I\xd4I}:{6&{>\x15\x8f\xb0&\x81\xb7>\x10\xb4_\x88H\xf9\x01@\xe1Yz\xd9\x91X\xcb \xa5\xca\x00\x8c\x8c\xf1\r\x00\xae*\xff]"\xff\xe9%\x8e\xac\xdeR\xd7\x1f\xa1\xd4\xf1\xda\x08\x85\xc4\xac\xe5\xbd\x98\x1f\xa4\xb2\xdb\x1f\xd96a\x06\x94\xd9\x11\xaf\xd0)2\x00\xc3\x13|6\x03_\x98\xfd\x99(\x7fz\x89+\xad?\xdfs3\xb4\x13A\xf9F\x83\xf0\x04\xde\x04.\x86\xc1\xf2\xbb\xfa\xaaE\x11\xa0p\x7f\xdc\xa2\xa7\xc2\x000\xf3\n\xf8\xf8\x010\xf7p\x0e1\x00\xe9$\xd6==\xaa\x03\x13\xfd_\x06\xd7zN\xcb\xf4[\x1f\xd1\x17\xedX\x88r\r\xbf\xa8\xaf\x892\x00\xf4\x8f\xe3\x16?\x15\x06`$\x87o\x81\xb0v\xfe\xe7\xa2\xff\xe9\xc4\xc4<\x976\x993Q\xe8\xf9\xf3\xda\x04K\xea\xad\x0f\x04K|\x0b\x95\xf1\x8a\x02\x85\xfd\xb4=\x9eJ\xc0s\xbb\xb1\xccP\x8e?\x00\xe0M\xf3?\x97\xb7\x7f:a$\xb3\xabw\xaa\xeb\xdf\xa3\xd4\xfe\x87\x15\n\x15n\xdb\xf5)\x99\xb7>\x10\x18\x9a)\xc4\xf7\xa0:\xb4#\x89aX5\x00\xb9\x1co\x84\xc1\x17m\xca T\x87I\xb0Ng\xbe\xf7\xaf`\xdc\x13\x97\xfe\x92\x06\xe0Q\xb2\x85\x83=\x00\xa5\x18\r\x8db\x80\xd5]I\x0c\xc5\xaa\x01\xf0\x19_#\xa9\xde\xdb0\xcc=*,\x01\xd4\n\xe4W-\xb24h\x10V\xe6MP\x1eF\xb0\xc6\x1f\xf7\xe1\xc3\x8a\x87\xe8\xdc\xdd\xf7&1$k\x06`x\x8c\xaf\x05\x10a1y!n\x92|\xfb\x97\xf1\xdb/\x83\xd7~\xf9\xdc\x0f5\x92\x0b\xf2\xcd\xa6\xae\xbc\xfe*p\xe8\xbbI\r\xc9\x8a\x01`\xe6\x15\x00\xfe\x97\x8d\xbe\x85\xda\xd0\x16K\xf4\xe7W\xdd\x18\xac\n0\x80R\xc2o}`\xe6\xa8\xae$\xae\x81b\x80\xf2\xb7&54+\x06`8\x87\x9b\x01\x0c,\xf9\xa5\x06+\x1f\xd7\xccp\xd2\xae\xff\xfc\xfe\xdd5(\xae\xb8.p\xf9\x93^\x1b\xd2\x888\xc1g\x19\x08O\xd2\xb9\x87\x1eIjx\x89\x1b\x80\\\x8e7\x10\xf0\x1f\x97\xfb\x9e\xe8\x7f:`\xb6\xfb\xf6/S\xec\xfe L\xb5\x07\x8e\xd4\x8b\xc7K\x1c\xd8\x11\x13\xae\xb9-\xc9!&n\x00|\xc67\x10lsX\x161\x02va\xa4C\xf9\x01\x00\x94E~\xe0\xa6\x84\x06\xcea\xb0/ao\xc3a\x0fd\xbe\x92d\x97\x89\x1a\x80\x911~7\xaa\x08\xfcqZ\x1e\xbe\x16\x84\x01\xe8\xa4\xe7\xda\xcb\xe0w^\x06\xaf\xf3U\xf1\x0f<\xa9`\xdf|\\s\x1b\x9d\xfb\xe4KIv\x99\x98\x01`f\xc7\x00\x9f\xab\xe67qg\x9c\t\x0b\xc3\x00L\xca\x94\xbf\xccd\xdf\xc7\xe2\xf3\x0c\xcb9\xfdQ\xed\xe6\xab\x06b\x03\x7f\xea\xd3Iw\x9b\x98\x01\x18\x1e\xc7{\t\xa8z\x12\xd7hgI4:\xcc\xc1\x9b?\xad\x97\xddd\xd6\xc2\xef\x8a\xe1\xd4w\x1f\xf1\xe4\xf4W\x8a\xc3w\xd1+\x0f\x1eH\xba\xdbD\x0c\x003\x13\x19\xdcX\xcbo\xc5\x0bH\x8e\xb4\x04\xfc\x96\xa3\xb0\xea\xbah\x07=\xc5\xc1Y\x00\xb6v\x9f\x103\xdaJ\x9f\xb4\xd1u"\x06`$\x87w\x80pZ-\xbf\xb5\xbd\x04\xd5*4\x8a\xf2\x03\x80n\xdb\n\xaf\xe3\xe2\xfa\x1b*\xbb\xfc6\xe6\xfb\xb3q\xcc\xfd\xb4\xfd\xc0>\x1b]\'2\xf2\xe11\xde\x89YU~j\xc1Q\xb2A(\x0e\x18A\xb05\xcd\x9e\x16\x85\xa9\xfe\x14\xca\x0b\x06H\x8fA\xf9\xcf\x02\xd4\x01\xa6\x0e\xb0\xea\x00S\'\xa0\xda\x01S\x04\xf1$\xc8\x14@\\\x00\xb8\x00e\xc6\xa0\xbc\xe7\xa0\xf4!8\xdesP\xc5Cp&\x0f\x02\xba`yt\xac\xd1\xee\x9fM\xe7>\xb9\xdb\xca\xb5\x8d\xbb\x83\x91\x1c\xbf\x91\x19?\xa8[\xd0\xf0Xj1\x02\xd1a\xd8Nz\xefr\xccV\xf4\xe9\x0fb\xc2)>\t7\xff\x102\xf9_!\x93\x7f8\xf9c\xcb3\xfe-\xf4\x8a\xfd\x1fJ\xb6\xd3\x19bW\xa7\xe11\xfe\x15"\xca\xf9\'\n<\x01\xa1~R\xa7\xfc\xe1\x93\xc8\xc6\xae\x91w\xf3\xbfA&\xff \xb2c?\x81*\x1d\x8a\xb97\x1e\x02&N\xa1\x8b\x9e\xb3\xe6\x86\xc4z\xa9G\x0b\xbc\xce\x94\x10\xe9\xd1FJ\x05\x9e\x80P\x1b\xcc\x16v\xf5-B\xf96\xb2\x85\x0c\xdfJp\x8a\xfb\x90\x1d\xff)2\xb9\x9f\xc0)>\x19m\xe3\xcc@\x07\xbf\x9f\xce\xdd\xf7u\x9bc\x8c\xf5\xb2\x0f\x8f\xf1\xcd\x00"\x8fn\x8a\x11\xa8\x9e\xb4\xcd\xf5S\xaa\xf3\x8b\xa2\xa6\x0e\xa0}\xf8\xdbh\x1b\xbd\x130S\xf57\xe8\xea\xdf\xd3\x05O\x9cc{\\\xb1\xde\x83\xa1Q>D\x84\x93\xe3h[\x8c@e\x94+\xf8\xd8v\xf7\x89\xc2\x15\x1d4\x96\xe2\x1f7\x0e\x7f\x18\xed\xc3\xff\x84\xb6\xe1o\x83\xf4x\x8d\x8d\xf0$\xd8\xdbN\x17=\x15\xb1[Q\x83(q5<\x9c\xe3K\xc0x0V\xe1)0\x04\x8d\xfc@\xc5EZ\x14\x7f\x8e@\xcdt\xa3t\x1e\xed#\xb7\xa3}\xf8V\x90WE\xf6.3\x90\xe1k\xe9\x82}\x89n\xfaY\x8c8Cj\xd7\xc6-\xfct\xd6ZJ\xdc\xda4\xc0\x08\xdc|\xadS\xa0\xfc4\xeb\xde4\x93\xf2\x03\x80\xd3\x85\xe2\xc0\xfb0z\xe6}(\x0e\\\x07PE\xfb\xdb\x002w\xa4E\xf9\x81\x98n\x0b3\xbb#c8\nBob\x03iqo uo\xfc\x16CM\x1d@\xd7\xf3\x9f\x84[\xf8\xfd\xe2_2\xe6y\x9c4u&\xad{&\xe1\xb5\xc6%\xe4\x8e\xa3\xd1\xd1q\\\x9d\xa4\xf2\x033\xde\x801\xe9\xcdc\x8f|\xcc\x08\xdf\xf6&=o\xfc\x96\xb9\xf8\xf30m\xeb0~\xfa\xb7\x91?\xf1\xb3`\xa7\xe7\xf8/0{\xe8\xf0\xdf\x94&\xe5\x07b2\x00\xc6\x1c_\xe6;)L\x0b\x18\x02\x9e\xa7\xf4\xa9\x99\x025\xdb<\xbf\x06J\xbdo\xc1\xd8\x99?\x82\xd7y\xfe\xcc\x87\xcc\x0c\xc6\x07\xe9\xbc\xa7\x1e\xb5-\xdf|b1\x00\x04\\n{`eC\xa0\xc3\xa5\xaf\xb4\xe8H\xad\x94\xdd{?\x1cSj\x94\x1ehy\xa5\x9f\x0f\xbb}\x98X\xfb\r\x14\x07>\x18|@\xfc\x97t\xc9\xdeo\xda\x96k!"\xbfu\xe3\xe3<\xe8\x19\xc4~\xa2IM\x83\rS\x89\t\xe9O)./\x99\xc9f\xa8\xc6\xc6-\xeez\xce[\xbdeK?Q\xce\xb6,\x0b\x11\xb9\x07\xe03^g{P\x8bQ~\x8b\xeaYo\xd24x\x07\xb3\x03xsdK\xdb\x9b^\xa8\x1a\xbf}\xcb\xc9\xc8\xe1\x91|\x9e\x13.hX\x19\x91\x1b\x00\xc3\xb8\xc2\xf6\xa0*eZ\xe9\xf4\x8c\xd2M\x1b\x85\x18\x0c\xc3\xb4\xa2\xcfR\xf6\xf2\\~v\xbfBsA\xc0\xfa)\x0f\xbf\x1e)\xf0Z\xdb\xb2, [\xb4\x0c\x8d\xf1\x11\x02V\xdb\x1eX\x94P\xf8?\xcb]\xac\xc5tW\x94Z\x00\x00\x06\x8e\x92\x83\xd7\xf4\xad\xa0\xc7m\xcbR&R\x030R\xe0\xb5\\B\xe2e\x8d\x04\xa1Q`F\xce%\\\xb9j\x15\xfd?\xdb\xb2\x00QO\x01\xbc\xc6q\xff\x05\xc1\x06D\xe8\xf6\x19\xf7\x8fL\xf0\xcbm\xcb\x02Dl\x00\x98q\x81\xed\x01\tB\xda!B\x17k\xfc\xdf\xd1Q>\xdd\xb6,\xd1z\x00\x8c\xb3l\x0fH\x10\x1a\x84~\x03<0>\xceV\xe3e\xd1z\x00\xc0\x06\x9b\x83\x11\x84\x86\x82p\xaa\xa7q\x7fxX\xae\x15"3\x00\xcc\x9c%\xc2I\xb6\x06"\x08\r\ta\xebH\x0ew\xd8\xea>2\x030:Y_\xd5_Aha\xae\x1a\x1a\xe3\x8f\xd8\xe882\x03`<q\xff\x05\xa1V\x08\xf8\xfc\xe8(\x9f_\x7fK\xd5\x11\x99\x01P$\x06@\x10\xea\xc0\xd5\xc0\xdd\xc3\xcc\xab\x92\xec4\xba\x18\x80\x04\x00\x05\xa1.\x88p\x12r\xf8n\x92}F\x18\x04\xc4\x89I\n.\x08M\xcaU#9~oR\x9dE\xb7\x0cHX\x99\x94\xd0\x82\xd0\xcc0\xe3\xf3I-\rF\x99\x07 \x06@\x10\xa2ap8\x87\xcf$\xd1Qt\x06\x80\xc5\x00\x08BT\x10p\xfd\xf88o\x8a\xbb\x1f\xf1\x00\x04!\x9d8\x9e\xc6W\xe3\xee$2\x03@\x84\xee\xb8\x85\x15\x84\x96\x82p\xd9\xd0\x18_\x15g\x17\x91\x18\x00f\xeeJ\xe6\x8a\x08BkA\xc0\'\xe2l?\x12\x03\x90\xcf\x8b\xfb/\x081q\xe9P\x8e/\x8a\xab\xf1H\x0c\xc0\xd0\xf8D_r\xd7C\x10Z\x0bb\xfcE\\mG\xe3\x01xPS%\x1f&-gO\x0b\xcb\x92\xf2\xaa\xe8\xc2\\^\x1bW\x05\xa1H\x0c\xc0\xc4Xi\x8c\x00\xf8\xbe\x86\xaf\x8d\x14\xc1l\x00\xe4\x165\x16\xacq]\x1c\xedFb\x00\x8c\x01\x1b\xa0\x04\x00F\x1bx\x9e\x0f#V@\x10\xa2\x83\xf1\x0efv\xa3n6\x1a\x03\xc0\x93\x0c`r\xf6g\xbe\xa7\xe1\xfb:\xa1\xab#T\x85\xd8\xe6\xc6\x83\xd0;:\x1e\xfd\xa1;\x91\x18\x80\x95N\xd6\'3\xd7\x00\x00\x801\x8cR\xc9\x87\xb1~l\xad0\x07\t\x004$\xc6\xe0\xda\xa8\xdb\x8c\xc4\x00\xb8n\x87\x0f\xe2\xc9\xc5\xfe\x7f\xdf7\x12\x1b\x10\x84:!\xc2\x9b\xa3\xce\xb9\x89\xc4\x00\x1c.\x0ei\xc3\x98\\\xea;\xd3\xb1\x01Y)\x10\x84Z\xc9\x8cM\xe0\xb5Q6\x18M*p\xa6\xcbg\xc6P%_\rV\n$6 \x08\xb5`\x0c.\x8f\xb2\xbdH\x0c\xc0 \x06K`~\xb6\xe2AhF\xc9\xd3\xe2\r\x08B\xf5\\\x1eec\x91\x18\x80\xad[\xa9\xa4\x8d9X\xd5\x8f\x98\xa7\xf3\x06\x04A\xa8\x98-\xa3\xa3\xdc\x1bUc\xd1U\x05\xf6\xf5\xd35\xfdN\x1b\x94J>X"\x84\x82P\x11\x1axMTmE\xb7\x1d\x98\xcd\xfez~\xefy\xe2\r\x08B%\x10E7\r\x88\xcc\x00\x1c\x1d\x1f?\xc4\x0c\xaf\x9e6\x8c6(yZ\xbc\x01AX\x02\x06\xce\x8b\xaa\xad\xe8\xce\x05\x98\xa2\x82a~\xa6\xfe\xd11<OCK\xde\x80 ,\x08\x01gF\xd5Vt%\xc1N\\3\xc9\x8c\x8aW\x02\x96Ck\x03\xdf\xd7b\x04\x04\xe1x\xfa\x999\x92\x1a\x1c\x91\x19\x80\xf3\xd6\xa0\x00S_\x1c`>\xcc\x0c\xcf\xf3\xa1}\x89\r\x08\xc2lr9l\x8c\xa2\x9d\x08k\x02\x12\x97\x0c?\x14\xc7`\xb51\xf0<-;\x0c\x05!DG4\r\x88\xb2*0\xc6^\x1a}\xb0\xbc-8j8\xcc\x1b\x10o@\x10\x00&\xac\x89\xa2\x9dH\r@6\xdb\x99\x83\xe6\xc7\xe2\x1bu\xe0\r\x94<\xc9\x1b\x10Z\x1c\x8e\xa6\nw\xa4\x06\x80\xb9{\xc27\xe6\xd1\x04\x06?\xbdR \x08-J\xfa\x0c\xc0\xd6\xadT\xd2\xbe\xff\xeb\xa4\xae\x80\xd6Al@\x9c\x01\xa1\xe5H\xa3\x07\x00\x00\xa3yoG\\q\x80\x05\xaf\x033J\x9e\x0f-\x1b\x8b\x84\xd6"\x9d\x06\x00E\x8c\xc6\x1a\x07X\x00\x02\xa0}\x1dz\x03b\x08\x84\x16 \xa2\x93\xb8"7\x00\xfb\xf7\xf7\x8c\xfbl~\x91\xfc\x15)\xe7\r\xe8\xe9\xf8\x801,\xd3\x03\xa1\xa90\x86\xcb{f\x9c(\xda\x8b\xdc\x00\xbc\xedm\xa4\'&\xa6\xee\x80\xc5\xd2\x93\xcc<\x9dI\xe8y>J\x9e\x0f\xcf\x0f\xea\x0fH.\x81\xd0(0\x87\n\x1fz\xb7\xa5\x92\x0f\xdf\xd70\xda\x80\rOD\xd1G\xe4e\x86\x01\x80|\xdao\x98\x1fQD\xafH\xf6\x92-\x02\x87y\x04&\xacDD\x04"@)\x05\x05\x80\x94T\xc9\x14\xec\xc3\xcc\xa1\xd2\x07\xfb`\x96\x9e\xce\xd2x\x14}F\x1f\x03\x00\xb0q\xe3\xca\xd1\x92\xaf\x7f\x1c\xcbU\x8a\x02f\xb0\xe1 n\xe0k\x94\xc2\xad\xc8R\xa1HH\x12\xc3\x0cc\x18^\xf8\x86\xf7\xc2R\xfa\xc1\xd4u\x99g\x91Lz\r\x00\x11\xe9B\xa1p\x07\x00?\x8e\xf6#\x87\x19&\x9c2\x94\xdd,\xadY\xea\xe7\x0b\x91\xc2\xcc\xd0\xa1\xc2\x97<=}v\x06W\xa2\xf0\xf3PJ\xe5\xa2\x90)\x16\x03\x00\x00\x87sc\x87|\xcd\xbf\x8a\xab\xfd81\x86\xa1\xb5F)\x8c\x1f\x04\x06A<\x04\xa1:\xca\xb1\xa8\xb2\xc2{\x9e\x86\x0e\x15\xbe\xee\xe8\xb4Az=\x00\x00\xb8\xe2\x9cu\xa3\xbe\xe7\xdf\x13W\xfb\x89\xc1e\x830\xe3!\x94<\x1f\xbe6a\xcd\x021\nB\x00#\xdc\xc6\xeeiL\x95\xfc\x99\xba\x16Q(\xfcl\x88@\n/D\xd1Tl\x06\x00\x00\x8a\xbat\xa7a\xe4\xe3\xec\xc3\n\x1cT/*g"\x96<\x7f\xba\xa4\x99\x8d\x95\x86\xb2ki\xf4L\xdf:\x94oz>)v*r\x98\x01\xed\x87/\x06\xcf\x87W\xf2\x83k\xce\x1c\xeb\xe1K\x04\xc0\x00\xfb\xa2h+\x96U\x802\xfe\xc4\xaa\xe7M[\xe9N\xe5\xaa\xf7\xc4\xd9\x8fu\x18`0X3f\xefN\x08V\x17\x08\xe5E\x06"\x82"\xaa\xeah\xaei\x0f\x83hz\xae\xc8\xe1\xe7\xbc\xd0\x94D\x07\xba\xee\xfb\x1aJ)P\xf0\xd3\xe9\xfeCq\x11\x88\x11\xac\x86\xcc\xfe;\xc2\xcf0\xfd\xbb\x99\xbf\xb72\xe5\xa8<\x87\x81\xbb\xb8\x95|)\x08@\xdfJD\x92l\x17\xfb\x18\xf6?3z\xee\xca\xae\xae_\x03\xc8\xc4\xddW\xc31\xfb\xea3\xa0\x88\x02\xe5F\xb0\x1cT\xcf\xcd\xf1\xcb\xae\xe7\xfc.U`\x84\x085,\x7f\x96\x8d\x06f\x19\x8d\xb0-\x10\x81\xc13\x7fo`\xc3Q^\x8e++;\x07\x1f\xda\x16k\x1ar\xd4\xd0\t}\xce@\x14m\xc5\xea\x01\x00\x80\xcb\xabv\xfb\xa6\xf4\x03W\xa9k\xe2\xbf4\r\xc6\xbcgj\xf6\xd4\xa1^\xdd\xe1E\x02\x96l\x18\xba\xdc\xb1\xc6\x8cRO\xe7F,\xd1s\xd9\xd3)\xff\x95\x17\x18\xc4\x02C\x9c\xf6.\x08p\x88\x80\xd0\x08\xa5\x81\xd9\xca\xce\x86a\x90\xfe\xe9\x92\x03\x8a\xc4\xfd\x07\x120\x00\xeb\xd6Qq\xff\xa1\xf1/\xafhk\x7f\xeb\xf4\xcbA\x88\x1d"\xaa,@YV\xea\xe9\xd8\x01P~\xc5\x93\xa2\xe9i\x83\xa2\x99)DUr\xcc\xea\x03\x0c\xf8\xe0\xc0\xf0 4<N\xe8\x8d\xd40=\xaa\x94\x19%\x9f\x19+7\xf0\x8a\x8e!\x8el\xcb}\xec\x06\x00\x00&\x87\xf3\x8ft\xbd,\xfbc"\x15\xe9\xc1\x86BL\x84\xba\xc1f\xe6}\x7f\\l#\xb4\xe63\x0eC\xf5.\x7f9nr\x1c\x14(\xebqq\n\xcc5B\\\xfe4\xfcr9\xd8I4\xa3\xeci\x7f\x9bW\r\x01\x19G\xfd,\xc2\xe6\x92\xe1\x89g\xf2Wwwe\x7f\x98d\x9f\xad\x8c\xd6\x0cc\x92-\x982\xad\xa4J\x85S\x8b\x00\x15Q0q&\x00:\xf7\xb3r\xa0\xb5<\x8difH\x11\xda\x1c\xa7\xaf\xa7\x87F\xa2h/\x11\x0f\x00\x00\x8e\x16\'\x7f\xb1\xa2#\xf3K\xa5\xe8\xd2\xa4\xfalm\x92\x7f\xf5\x95u\x8fC\xc3S\x96\xc0\xcc\xfa\x02\xf1\x02n~\xf9\xefDs\xdb\x99\xb5|\xb9t\xd4\x9d\x83p\x06\x01\xae\x1b\xc9&\xb9\xd4\xa2@{\xa2R\xfe\xa0\xbd\x84\xb8d\xe3\xe0x\xa1\xe0}\x8e\xe7z\x93BL\xd42_\x8f\x9d\xd9s\xf0\xd9\x7fL\xf8G\x1b\xb060\xe1\x9f\xe9e\xcf\x8a\x97\xdcR8\xe6\x88!G\xed\x88\xb2\xbd\xc4\x0c\x00\x00\x1cya\xf8\x01\xad\xcd\x1dI\xf6\xd9\xaa(E\xb3\xe2\xf5\xad\x81j\x81]\x9d\x04\xec\x88\xb8\xbdd\xd9w\xe0\xd8\xc6\xee\x15\xab\x1e" \xb2#\x8e\x85\x85\xf1|\xdd|A\xb0E "\xb8n\xa2\xef\xb3\xc4QJ\xf9\x83}\xaa\x87\x88"\xcb\xaeM\xfc\x8amX\xdb\xff\x84\xef\x9b\xbfM\xba\xdfVd\xb1Y@\x8arZ"\x1a(\x9a^\xf9\x01\xc0Qt_\x94\xca\x0fX0\x00Dd\x0e\r\x17\xbfl\x0c\xefL\xba\xefVc\xb1\xb4\x8b4\x86\x07j\x85\x01\xb8Ns\x07\xfe\x00\x84\x1b\x80\xe8\xb6\xc8\x9b\xb55\x9e\xa7\x9f\xcd\xbf\xb1\xb3#{\xb7M\x19\x9a\x1d\xc3\xdc\xdc\')\x85Q\xffVx\x80\x94R\xc5\xd0\xfd\x9f\x8a\xb4][\x03:\xf8\xd4\xd1\x9f\x18\x1fw\xd9\xea\xbf\x15HK\xbam\\8\xe1f\xa7f\x87\x19p\x1c\xfaa\xd4\xca\x0fX4\x00W\\\xb1\xae8:9\xf9\xe7l\xf0\xa2-\x19Z\x81E7\xfc4\xb0\xe60\x829\x7f+D\xfd\x81\xe9\x94\xeco\xc6\xd2\xb6\xed\xc1=\xf9l\xfe\xcd]\x1d\xd9;)\xa22\xc7\xc2\\\x82CU\x9bh\x1a@\xc1\x9c\xbf\xc9\x9d\x9b98\x8ezj\xb0\xcf\x89\xe44\xe0\xf9X\x0f\x9d>\xb1\xf3\x85{=_\xff\x9dm9\x9a\x15\n\xb7\x187\x03D\x84\x8c\xdbZ\xca\x1f\x18<\xf5\xe9\x18\x9b\xb7\xcf#\x8f\xbc0\xb0\xe6\x94\x81\xbb\x1dE\x17\xdb\x96\xa5\x191\xda4\xfc\xd1i\xcaQpZ\xc4\xe5\x9f3n\xa5\x8e\x0c\xf6\xa9\x93\x88H\xc7\xd2\xbe\xed\x01\x02\xc0\xf9\xe7\x9fxllj\xeaC\xc6\xe0\xa8mY\x9a\x11\xe5,~\x9b\x1b\xc1,8-\xaa\xfc\x00\xe0\xba\xea\xe6\xb8\x94\x1fH\x89\x07P\xe6\xe0\xc1\xc9k\xb2\x1d\x99\xdb[\xa9n@\xb96|\xb9\xf8h\\\xee\xad6\x06\xdc`\xa1\x80r\x81\x92\x05\xf75\x10\x81B\xeb\xe5\xb8\x94\xce\xbd\x0fu\xa2\x1c54\xd8\xabN&\xa2bl}\xd8\x1e\xe4l\x9e~\xba\xe3n_\xfb7\xd9\x96#\t\x0c\x1b\xf8\xbe\x81\xf6g6\xbd\xc4\xf9\x0c;*U\xb7zYH\x11\x1cG-\xae\xd8\xcc(\xff\xe3\xfb\x06\x9eo`t#\xf83\x95^\x00\x82\x82\xfaT\x9c\xca\x0f\xa4\xcc\x03\x00\x80\x87\x1e:\xd4q\xcai\x83\x7f\x9d\xc9:\xd7\xdb\x96%\x0elF\xe5\x1b\xc1\x0b`\x00\xca\xa1\xa0tX\r\x90"\xb8Nc\x19\xbb\xe3\xae\x01\x03\xae\xeb\xfcn\xb0O\x9d\x1bw_\xa93\x00\x00\xb0w\xefK+W\xf4t\xff\xbd\xeb\xa8km\xcb\x12%\xc60\xb41\xd6&\xde\xccA\xb9\xf0\xb4\xb2\xa4\xcb_U;\x14L\x0b\xd2\xf9x//\xbf"v\xb3\xce\xb6\xfe\x95\xb4+\xee\xbeRi*7n\x1c\x1c?\xfc\xdc\xd0G|\xdf\xdck[\x96\xa8\x98V>\x8b^*\x11@)\xcd\xb6 g\x19\x97\xbf\n\x82\x13y\x1aw:\x90q\x9d\x7fHB\xf9\x81\x94z\x00e\x1e\x7f\xfc\xc8\t}\xab{\xbf\xef(\xba\xc8\xb6,\xf5\x92\xa6\xa3\xc5|\xcb\x86h\x0e\x048\x11\xbc\xf5\x17B\x85q\x84FB9jd\xb0W\x9d\x12\xf5\xae\xbfE\xfb\xb3=\xe0\xa5\xd8\xb6\xed\x84#\x93\xb9\xf1\xb7\x1b\xc3\xbf\xb7-K=0\xd2\xf5FJ\xcb\x92\x1a)\xc0\x8d\xe8\xad\xbf\x10\xa6\\\xa4\xb0APD\xc8*\xf5\xf6\xa4\x94\x1fH\xb9\x01\x00\x80\xf5\xeb\xfb\x9f\xf3\x8a\x93o5\xcc\xbf\xb3-K\xadh\x1do\x84\xbfZ\x88\x08\xca\xb1W1\x88(\x0c\xf4\xc5\xbd2\xc1\xdc8+\x03Dp]\xe7\xf3==\xf4\xd3D\xbb\xb5=\xeeJ\xd9\xb7\xef\xd8I+{\xba\xbf\xd3\x88EE=\xcfG\x1a/\xb5\x8dU\x01\xaa#\xc2_S\x7f\rP(\x94\x01d\\\xe77\xfd=t!\x11%j\xb1R\xef\x01\x949\xeb\xac\x81\xe7\xc7\x86\x8bo\xd1\x9ei\xc0-\xc4\xe9S~ \xdcN\x9b\x90hDaF_\xc2\xaeP#\xbc\xff3\x8e3\xdc\xe6\xd2\x1b\x92V~\xa0\x81\x0c\x00\x00l\xda\xd4=4\x99\x9fx\xaf\xef\xeb\xaf\xda\x96\xa5R\xd2^~\xcb\tk\xf8\xc7\x06\xcdN\xea\xb10\xc0\x94\xdf\x00"*\xb8\x8a\xfe\xdd\xca\x95d%\r\xbe\xa1\x0c\x00\x00\xac_\xdf\x9f\xf3\x8am\x1f\xf1|s\x13\x1a\xc1\xc0\x87\xc7R\xa5\x16\x8a/(Ha\xdb6\x83\x8e\x8c\xf4\xee\x86$"O9\xce\xebzz\xe8\x11[24\x9c\x01\x00\x82\xf3\x06\x9f\xdc\x9b\xfd\xac\xe7\xeb\x1b\x98\xe1\xd9\x96g)\xca\x87c\xa6\x19"\x82\xe3D($\x01N\x84\xeb\xfau\x8a\x92\xce\t\x18\x91Q\xcay\xeb`/\xed\xb0*\x86\xed\xebP\x0f\xccL\x07\x0fO]\xd5\xa6\x9c\xaf\x91\xc2\x1a\xdb\xf2,\x841\x9c\xea\xec\xbb\xd9\xd4\x9d@Sv\xf7Sf\xf12\x99\xf4\x05\x013\xae\xfb\xfe\xfe^\xfa\xbam9\x1a\xd2\x03(CD\xbcvM\xfb\xbd\xa3\x93\x13\x17\xf9\x9aw\xd8\x96\xa7\xd1\t<\x81\xea\x1f\tF\x18\xddW\xc9\x07\xf9\x1a\x8e\xa0\x84\xf9\riP~\xa0\xc1\r@\x99M\xebz\x9f9\xfc\xdc\xb1\xab=\xdf\xdcd\x18\x91\x17Nl%\xca\xd1\xfaJ}\xc3r2\x8f\xd3\x02\x07sF\x80OD\xd7\x0c\xf4:_\xb2-H\x99\xa60\x00\x00p\xfe\xf9\'N~\xed\x96\xecg&\nS\xaf7\x86\x0f\xda\x96\xa7\x91\xa1\xa0\x0c\xd5\x92F\x80T\xb9P\x87\xa5\xe8~\x83\xc1\xa0\xbc\xe3\xbaW\x9e\xd0\xef\xfe\xb3mYf\xd3\x94\xb7\xee\xe9\xa7\x8f\x9c\xe0v\xf4|1\xeb\xaa\xb7\xd9\x96\xa5\x91b\x00\x0b1?Y(\xaa\x1d{Ib=\x06@4\x9cms^\xd5\xb7\x92Rw\x18N\xe3\xdc\xc5*af\xe7\xe9\xe7\'_\xdb\x91\xc9|N)\xdabK\x8eF7\x00@\x10\x1c4\x86A\x8a\x1a\xf2\xac\x01\x9b\x06\x80I\xfd\xae\xbbC]\xdd\xd5E\xa9,\x7f\xdf4S\x80\xf9\x10\x91>\xe3\xe4\xae\x1f\x1d;2y\xa9\xe7\xfb\x7fi\x80Q\xdb25$a*m[\x9b\xdbpU\x85,\xc3\x8eR\x7f\xfb\xb2~\xf5\x8a\xb4*?\xd0\xc4\x06\xa0\xcc\xd9g\xf7\x8c|\xed\x96\xf6\x9b\xc7\'\n\x7f\xe0ks;[\xd8\x01\x93\xeaD\xa0\xc5\xa0\xa0\x98\xa8\xeb8\xd3.\xbf\xeb*(G\xa56\xb1&-\x10h\xcc\xcd\xb8W\x0e\xf6;\x1f\x89\xb3\xa0g4\xb2\xb6\x10;w\xee\xccv\xadZ\xfb\xea\xb6l\xf6\x0bIN\x0b</\xd5\xcf\xc0\\\x08Pj\xe9*\xbc\xcc\x0cm\x18\x9c\x92\xfa\x06\xcb\x0c\x07n\x82S\x00r\xd4o\xbb\xb2\xea\xea\x15+\xe8\xb0\xed\xb1W$\xafm\x01l\xb0\x7f?\xb7\xb5wy\xefQ.\xfe\xcc!\xda\x14w\x7f\xbe\xafS\xef\x05Pp\xfalUi\xbb\xe5\xc4!N\xf1\xe0H\x05\x9eK\xecn\x0b\xd1\x90\xeb\xd2\x8d\xfd\xab\xd4-D\xd40A\x9f\x964\x00e\xf6\xef\xe7\xb6\x8en\xefm\n\xf8\xa8R\xb4=\xae~\xb4o`\xd2\xa8$\xe1\xdb>\xd8\x0fT\xfb\xa3`\xbb\xd6\xe1R8\x8a\x96<\x17\xa1n\x08\x9e\xab\xd4-\xfd\xbd\xea\x13D4n{\xbc\xd5\x8b/`\xe7N\xcev\x0f\x94\xde\xe2*\xfa\xa8"zE\xd4\xed\xa7m%\xa0\xfc\xb6W\x11\'\xef\x18\x13\xac\x16\xa4\xc9#p\\\x07q\xecEb@\x83\xf9\xce\x8e\x95\x99\x8f\xf7t\xd0\x01\xdb\xe3\xac\x151\x00\xb3\xb8\xfdvv.\xbex\xea\nr\xd5\xfb\x14\xd1\x1b@X\x19U\xdb\xbeo\xec*\x06\x01\xa4\x14\x1cB"k\xf8\xbef\xb0\xb1k\xf4\xe2(\x11\xce\x0c\xa3\x14}\x9f2\xfe\'V\xafj\xdfou\x80\x11 \x06`\x11\x0e\x1c\xe0\xf6\xb6\xce\xd25\xa4\xd4;\x99\xf1jEh\xab\xa7=c\x82\xf3\x00\x92^F\xafen\x1f%6\xbd\x027\xe3D\xf6\x803\x83\x95\xa2\xbb\x15;\x1f\x1f\x1c\xa4}\x89\x0f&&\xc4\x00T\xc0\xe1q^m\x8a\xfe\xb5\xc6\xf0\x1f;\x8a.\xa0\x1a\x97O\xb5I\xe8\xf4\x9aY\xbb\xf2\xd2\x92\xb1\xc7\x86\xa1\x81\xc0+H\xe0\x128\x8e\x82\xaa\xd3\xe81\x00Rt@\x11}{E\xbb\xfajg\'=\x97\xc8\xc5J\x90t<\x1d\r\xc4\xe1q^\x8d\x82\xbeB\x1bs\x89"\\\xc0\xa0mJ\xa1\xa3\xd2\xdf\xc7\xe9\t\x04\xf5\xf6\xd2\x9f\x9b\xcf\xcc0\x1c\xfc\x9b\x99#7\x08\xae\xa3@\xb5*?\x01\x0e\xd4\x189\xf8\xbe6\xea\xff\x9c\xd0O\x0f\xd9\xbe^q\x92\xf2G%\xfd\x1c:\xc4\x1dJM]\x02\x97.&\xa8W\x82\xf8,E\xb4n\xa9\xdf\x18c\xa0\x99\xc1\xba\xf6b!D\x04\xa8 v\xaf\x12\x9a\xd7\xc7\x891A\x86\xd6t\xdaq-\x8d0\x90\xc9V\xbf\xe6\xaf@/2\xf0\xb0\x9b\xa1\x07\x1d\xa8\x1d\xabV\xe1wiO\xe0\x89\x8a\xc6~jR\xc8\xed\xb7\xb3\xb3\xfe\x15\xa3+{3m\x9b\x1c\xd7\xdd\xec:\xbc\x81Y\xad\'\xe63\x00ZGj&\xb0h\x8c\t\x13j\x966\x04\x8c\xa0f|\x10\xb9\x0f>kt\x85_\x0e\x0eK\xa9\x19\xcc\xf2\x1088c\x81y\xee\x83K\x8a**D\xc2\x00@t\x10\xcc{\x00\xect\x1dzT\xb1\xf3\xcb\xfe\xfe\xe6s\xed+\xa5\xb9\x9f\xa2\x94q\xd3M\xacn\xb8ade\xa9\xd4\xd1g\x1c\xa7\xcf\x10\xf5\xc0\x98>G\xd3`\tzuV9k\xa1\xd0\xa1HM2\xcc\x04\x88FA(\xc0\xf0\x846\xc8\x83x\xd2\x18\x94l\x8f#\r\xb4g\xd4\xe9\x04\x95%R\xf9\x92\xaf\xf7\x13|\x87\x88\x9c\x92\x069\xa1#\x11l\t\x83q\x1c\xd7\xb4\x81s\xbd\xbd\xee#q\x9f\xb6+\x08\x82 \x08\x82 \x08\x82 \x08\x82 \x08\x82 \x08\x82 \x08\x82 \x08\x82 \x08\x82 \x08\x82 \x08\x82 \x08\x82 \x08\x82 \x08\x82 \x08\x82 \x08\x82 \x08\x82 \x08\x82 \x08\x82 \x08\x82 \x08\x82\xb0$\xff\x1fL\xd6\xad\xfe\xe1\x95\xed\xc3\x00\x00\x00\x00IEND\xaeB`\x82'

qt_resource_name = b'\x00\x03\x00\x00x\x83\x00q\x00r\x00c\x00\x0b\x0e>>\xdf\x00w\x00e\x00a\x00t\x00h\x00e\x00r\x00.\x00i\x00c\x00o'

qt_resource_struct_v1 = b'\x00\x00\x00\x00\x00\x02\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x02\x00\x00\x00\x01\x00\x00\x00\x02\x00\x00\x00\x0c\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00'

qt_resource_struct_v2 = b'\x00\x00\x00\x00\x00\x02\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x01\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0c\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x01ya\x1cp\xd5'

qt_version = [int(v) for v in QtCore.qVersion().split('.')]
if qt_version < [5, 8, 0]:
    rcc_version = 1
    qt_resource_struct = qt_resource_struct_v1
else:
    rcc_version = 2
    qt_resource_struct = qt_resource_struct_v2

def qInitResources():
    QtCore.qRegisterResourceData(rcc_version, qt_resource_struct, qt_resource_name, qt_resource_data)

def qCleanupResources():
    QtCore.qUnregisterResourceData(rcc_version, qt_resource_struct, qt_resource_name, qt_resource_data)

qInitResources()

ui.py

from PyQt5 import QtCore, QtGui, QtWidgets


class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(500, 300)
        MainWindow.setMinimumSize(QtCore.QSize(200, 200))
        icon = QtGui.QIcon()
        icon.addPixmap(QtGui.QPixmap(":/qrc/weather.ico"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
        MainWindow.setWindowIcon(icon)
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.horizontalLayout = QtWidgets.QHBoxLayout(self.centralwidget)
        self.horizontalLayout.setObjectName("horizontalLayout")
        self.gridLayout = QtWidgets.QGridLayout()
        self.gridLayout.setObjectName("gridLayout")
        self.comboBox = QtWidgets.QComboBox(self.centralwidget)
        font = QtGui.QFont()
        font.setFamily("微软雅黑")
        font.setPointSize(11)
        self.comboBox.setFont(font)
        self.comboBox.setEditable(False)
        self.comboBox.setCurrentText("")
        self.comboBox.setObjectName("comboBox")
        self.gridLayout.addWidget(self.comboBox, 0, 0, 1, 1)
        self.textEdit = QtWidgets.QTextEdit(self.centralwidget)
        font = QtGui.QFont()
        font.setFamily("微软雅黑")
        font.setPointSize(11)
        self.textEdit.setFont(font)
        self.textEdit.setReadOnly(True)
        self.textEdit.setObjectName("textEdit")
        self.gridLayout.addWidget(self.textEdit, 1, 0, 1, 1)
        self.horizontalLayout.addLayout(self.gridLayout)
        MainWindow.setCentralWidget(self.centralwidget)

        self.retranslateUi(MainWindow)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)

    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "查询省会城市天气"))


import qrc_rc

main.py

import sys
import requests

from PyQt5 import QtCore
from PyQt5.QtWidgets import QMainWindow, QApplication

from ui import Ui_MainWindow

cities = {
    '澳门': 101330101, '北京': 101010100, '长春': 101060101, '长沙': 101250101, '成都': 101270101, '重庆': 101040100,
    '福州': 101230101, '广州': 101280101, '贵阳': 101260101, '哈尔滨': 101050101, '海口': 101310101, '杭州': 101210101,
    '合肥': 101220101, '呼和浩特': 101080101, '济南': 101120101, '昆明': 101290101, '拉萨': 101140101, '兰州': 101160101,
    '南昌': 101240101, '南京': 101190101, '南宁': 101300101, '上海': 101020100, '沈阳': 101070101, '石家庄': 101090101,
    '台北': 101340101, '太原': 101100101, '天津': 101030100, '乌鲁木齐': 101130101, '武汉': 101200101, '西安': 101110101,
    '西宁': 101150101, '香港': 101320101, '银川': 101170101, '郑州': 101180101
}


def get_weather(city):
    """获取天气"""
    url = 'http://wthrcdn.etouch.cn/weather_mini?citykey={}'.format(city)
    res = requests.get(url)
    data = res.json()
    if data['status'] == 1002:
        return data['desc']
    data = data['data']
    result = '{}天气预报\n'.format(data['city'])
    result += '实时温度:{}℃\n'.format(data['wendu'])
    for forecast in data['forecast']:
        result += '{}:'.format(forecast['date'])
        weather = '{} ~ {}'.format(forecast['low'].replace('低温 ', '').replace('℃', ''),
                                   forecast['high'].replace('高温 ', ''))
        result += '{} {}\n'.format(weather, forecast['type'])
    result += '{}'.format(data['ganmao'])
    return result


class MainWindow(QMainWindow, Ui_MainWindow):
    def __init__(self):
        super(MainWindow, self).__init__()
        self.setupUi(self)

        # 设置省会城市下拉框并绑定事件
        _translate = QtCore.QCoreApplication.translate
        for city in cities.keys():
            self.comboBox.addItem(city)
        self.set_weather()
        self.comboBox.currentTextChanged.connect(self.set_weather)

    def set_weather(self):
        city = self.comboBox.currentText()
        weather = get_weather(cities[city])
        self.textEdit.setText(weather)


if __name__ == '__main__':
    app = QApplication(sys.argv)
    win = MainWindow()
    win.show()
    sys.exit(app.exec_())

效果
在这里插入图片描述

打包

pyinstaller -F -w -i weather.ico main.py




TODO:打包OpenCV

1.jpg

显示一张图片

import cv2

image = cv2.imread('1.jpg')
cv2.imshow('1', image)
cv2.waitKey(0)
cv2.destroyAllWindows()




TODO:打包TensorFlow

代码见:调用ImageNet预训练模型进行图像分类

效果
在这里插入图片描述

打包(本人尝试失败)

pyinstaller -F main.py --additional-hooks-dir=hooks
pyinstaller -F -w main.py --additional-hooks-dir=hooks

Trouble with Tensorflow 2.0 · Issue #4400

2019.11.1:Currently, the highest TensorFlow version that PyInstaller can bundle is TensorFlow 1.14. I have to keep my development under this version of TensorFlow. Hopefully PyInstaller can bundle TensorFlow >= 1.15.




TODO:函数变命令

fire

pallets/click: Python composable command line interface toolkit




遇到的坑

1. 报错 ModuleNotFountError: No module named 'requests'

一开始先别用 -w 参数,看报什么错

pip install requests --upgrade

2. 报错 This application failed to start because no Qt platform plugin could be initialized. Reinstalling the application may fix this problem.

解决方案一:用 UPX 打包报这个错,可去掉 UPX

解决方案二:在 C:\Users\Administrator\AppData\Local\Programs\Python\Python36\Lib\site-packages 搜索 platforms 拷贝 platforms/qwindows.dll 放在同一文件夹下,即platforms文件夹下有一个qwindows.dll。这个方案的可执行程序的占用空间小一些,但没有图标,不知如何解决。
在这里插入图片描述




参考文献

  1. PyInstaller GitHub
  2. PyInstaller Documentation
  3. UPX官网
  4. python-fire: Python Fire is a library for automatically generating command line interfaces (CLIs) from absolutely any Python object.
  5. Python打包成exe终极版
  6. 天气查询应用
  7. Python 官方推荐的一款打包工具
  8. Python 打包 exe 程序避坑指南
  9. Python GUI Programming Cookbook - Third Edition
  10. Understand How Tkinter pack Geometry Manager Works by Examples
  11. Layout management in Tkinter - place, pack, grid managers
  12. PyQt5 Documentation
  13. Packaging PyQt5 & PySide2 applications for Windows, with PyInstaller
  14. PyInstaller 打包单文件 exe 注意事项
  15. pyinstaller ModuleNotFoundError - Stack Overflow


这篇关于Python打包为exe——pyinstaller的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!


扫一扫关注最新编程教程