python tkiner实现自动打包程序

环境 python3.x

使用前请确保安装pyinstaller库

本程序还未完善,可以自行完善

若要使用加密,请自行安装cryptodome库

import tkinter as tk
from tkinter import ttk, filedialog, messagebox
import os
import sys
import hashlib

#使用前请先安装pyinstaller库
#pip3 install pyinstaller
#加密需要pycrpto库 python3.x安装不了,若是必须加密,请使用 pycryptodome
#pip3 install --timeout pycryptodome
base64_ico=b'AAABAAEAQEAAAAEAIAAoQgAAFgAAACgAAABAAAAAgAAAAAEAIAAAAAAAAEAAAA/2AAAP9gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMAAAAJAAAADAAAAAoAAAAFAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAABQAAAA4AAAAdAAAAMQAAAD0AAAA2AAAAJQAAABUAAAAKAAAABAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAIAAAAEwAAACUAAAA9AQcOXwcfPY0MM2SyCCVKnAINHHIAAABQAAAANQAAACIAAAATAAAACQAAAAMAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAABAAAAAsAAAAZAAAALQAAAEkDDh1wCShPoxFFgNUbYqj1K3/E/y13ufobVpXlDjhrwQYePpMBCRRqAAAASQAAADEAAAAeAAAAEAAAAAcAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAGAAAAEAAAACAAAAA2AAMGVgUXLoEMM2O2FVCR5B9stPsng8v/LJDW/z2g4f9Qr+n/R6Pg/ziMzf8mbrD3F0+M3wwyYrcFGTSKAQYOYgAAAEQAAAAtAAAAGwAAAA4AAAAGAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAkAAAAVAAAAJwAAAEEBCBFlByFClQ8+dckYW5/vIna+/yqJ0f8tktj/LZPZ/yyS2P89oOD/UrHr/1Cw6v9Nrun/Sanl/z+b2/8xg8b/IWap8xRIg9cKLVmuBBUqgQADCFsAAAA+AAAAKQAAABgAAAAMAAAABQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAEAAAADQAAABsAAAAwAAAATQAOIXUKLFapGE2I2h1mrPcnf8f/LI7V/y2T2f8tk9n/LZLY/y2S2P8skdj/PqDg/1Wz6/9Rser/Tq7p/0ys5/9Kq+f/R6jm/0Ki4f84k9X/K3u//h9gou8WRnzQByZOpAAOIngAAQNVAAAAOgAAACUAAAAVAAAACgAAAAQAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAcAAAARAAAAIgAAADoAAwlbAhcziA85ar0sZp7oWJzM/GS04v8yltr/L5Xa/y+U2f8uk9j/LZLY/y2S2P8tktj/LJHY/z+h4f9Wte3/VLPr/1Gw6v9Oruj/S6zn/0ip5v9Gp+X/RKbk/0Ci4v9MqOL/cLrj/1GUxvwsZ6DqEj90yAUhRZsACxlwAAAATgAAADUAAAAhAAAAEgAAAAgAAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAAAACgAAABcAAAAqAAAARQEKFmoGI0icGUp/zz17svJor9r/itb1/5rm//98z/X/NZjc/zCV2v8wlNn/L5TZ/y6T2f8tktj/LZLY/yyR2P9AouL/Wbfu/1a17P9Tsuv/ULDp/06t6P9Lq+f/SKnl/0Wm5P9Bo+L/U7Do/5Ph/v+Y5P//i9f1/2634P9Ji7/5Jl6X5A43ab8GHjyRAgkTaAAAAEgAAAAwAAAAHgAAABAAAAAGAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMAAAAMAAAAHQAAADMAAQJRAxMoewouXLAdVI/fTpDD+XjC6P+S3vv/meb//5jk//+Z5P//e830/zaZ3P8yltv/MZba/zCV2v8vlNn/L5PZ/y6T2P8skdj/QaPi/1u57/9Ytu3/VbTs/1Oy6v9Qr+n/Ta3o/0qr5v9HqOX/RKXj/1Sx6P+S3/3/mOT//5jk//+Z5v//l+P+/3vI7v8wg8f/HWWr9xRLid0MMmC2BRkyiAEGDWEAAABAAAAAIQAAAAoAAQMBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAwEAAAAOAAAALQEGDlsGHTuODjpvwxxbnewrer/+TaXe/5Pg/P+Z5v//mOT//5Xh/v+W4v7/meT//3zO9f84m93/NJjb/zOX2/8yltv/MZXa/zCU2f8vlNn/LZLY/0Kk4v9du/D/W7ju/1i27f9VtOz/UrHq/0+v6f9Nref/Sqrm/0an5P9Ws+n/i9r7/5Th/v+X4///l+P//5jk//+I2fr/PqDg/zGU2f8sitH/JHe//xpfpPMSRYHWCy1ZpwYcOGICChMdAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADBBMmJgsvXIQUSIPRJGms9TaKzP9BoN//Q6Xk/1i06v+U4P3/l+P//5jk//+D1Pf/iNj5/5rl//90yfL/OJze/zWZ3P81mNz/NJfb/zKX2/8xltr/MJXa/y+T2f9EpeP/X73x/1267/9auO7/V7bt/1Sz6/9Rser/T6/p/0ys5/9Iqeb/WbXr/3vO9f+G1/n/j938/5Hf/f+Y5P//g9T4/z6f3/8zl9v/Mpfb/zGW2/8ukdf/KIXN/yFyuv0XWJ/iDTlwUgAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAg49d14mbbLxQJjX/0qp5f9KrOj/SKrm/0Wm5P9Zter/lOD9/5jk//+Z5P//bsXx/3TJ8v+P3fv/Ua7m/zib3v84m93/N5rd/zWZ3P80mNz/M5fb/zKW2/8wldr/Rafk/2G+8v9fvPH/XLrv/1q47v9Wtez/VLPr/1Gx6v9Oruj/S6vn/1Sx6f9jvO3/cMby/3vO9f+L2vr/l+P//2nB7/88nt//NZnc/zOX2/8xltr/MJXa/y+U2v8ulNr/IXO8/A9CgG0AAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEPQYBuN4jJ+1Gy6/9Oruj/TKzn/0qr5/9IqeX/W7fs/5Pg/f+D1Pj/j938/1+57P9Rr+f/VbLo/z2g4P87nt//Op3e/zmc3v83m97/Nprd/zWZ3P80mNv/MZba/0eo5f9kwPP/Yb7y/1667/9buO3/Wbju/1a17f9Tsuv/UbDq/06u6P9Lq+f/SKnl/02s5v9Rr+f/b8Xx/3/R9v9Rr+f/PaDg/zea3f81mdz/M5fb/zGV2v8vlNn/LpTa/yF0vPsPQn9sAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABD0GAbTeIyftTs+z/ULDq/0+u6f9Nrej/Sqvn/1y47P+G1vn/W7fr/1az6v9IqeX/QaPi/z+i4f8/oeH/PaDg/zyf4P87nt//OJnZ/zSOzf80kND/NZnc/zOX2/9Jqub/ZcL0/2PA8/9Yr+H/T6DS/1Ss4P9XtOr/VrXt/1Oy6/9QsOn/Ta3o/0qr5v9HqOX/RKXk/0Sl4/9FpuP/QaLi/z2f4P84nN7/Nprd/zSY3P8yl9v/MZXa/zCV2v8idb37D0J/bAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQ9BgG05icr7VrXt/1Oy6/9Rser/UK/p/06u6P9Qr+n/U7Hp/0mq5v9GqOX/Rqfk/0Sm4/9DpeP/QaTj/0Ci4f89nNv/OJHO/zOGwP8xgLn/MofD/zea3P81mdz/S6vn/2fD9f9lwfP/VabW/0qVxv9Klsf/TJzO/1Cn3P9TsOf/U7Lr/1Cv6v9Mrej/Sqrm/0eo5f9EpuT/QaPi/z+h4f89n+D/Op3f/zib3v82md3/NJjb/zKW2/8xltv/InW9+w9Cf2wAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEPQYBtO4rL+1m37v9WtOz/VLPr/1Kx6/9RsOr/T6/p/02t6P9MrOf/Sqvm/0ip5v9HqOX/Rabk/0Gf3P88k83/NofA/zSCu/8zgrv/MoG6/zKDvf84mNj/N5ve/02t6P9pxfb/ZL/w/1Kfz/9Nl8f/SpbH/0aUx/9Hk8X/SZfL/0yi1/9Pq+T/T6/p/0yt6P9Jqub/R6jl/0Sl4/9Bo+L/P6Hh/zyf4P86nd//OJvd/zWZ3P80l9v/Mpfc/yN2vfsPQn9sAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABD0GAbTyMy/tbue//WLbt/1a17f9VtOz/U7Lr/1Kx6v9QsOn/Tq7p/02t6P9Lq+b/RqPe/z+Vzv86isH/PIvC/0maz/8+jsX/NIO7/zSDvP8zgrv/OJPR/zmd3/9Prun/bMf4/2K56f9RnMv/TpnI/0OWzP8zk9X/OJPQ/z+Syv9CkcX/RZTI/0id0/9Lp+D/S6vm/0mq5v9Gp+X/Q6Xj/0Gj4v8+oeH/PJ/f/zmd3v83m93/NZnc/zSY3P8kdr77D0J/bAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQ9BgG09jcz7Xrzx/1u47v9Zt+7/WLbt/1a17P9Us+v/U7Pr/1Gw6f9Lpt//Q5jO/z+OxP9Ckcf/UKTX/2K76/9vyfj/Ybjp/zyMw/81g7z/NIO7/zeNyf87nt//UbDq/23I+P9esd//UZvJ/0yZy/80lNT/LJLY/y2S2P8uktj/M5PV/zmSz/8+kMj/QZHH/0SYzv9Hotv/SKjk/0ao5f9DpeP/QKLi/z6g4P87nt//OZze/zeb3f81mt3/JXe++w9Cf2wAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEPQYBtP47N+2C+8v9du/D/XLnv/1q47v9Zt+7/VrTr/1Cq4P9ImtD/Q5LG/0iYzP9Uqt7/Yrzu/2rG9v9uyfj/b8r5/3LM+v9dsuP/OonA/zaEu/83iML/PZ3c/1Oy6/9ux/b/W6jW/1Gcyv8+ltL/LZLY/y2S2P8tktj/LpPZ/y+U2v8xltv/NJfa/zmX1/88lM//P5LJ/0GVzf9Dntj/RaTh/0Ol4/9AouL/PaDg/zue3/85nN7/N5ve/yV4v/oPQX9sAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABD0GAbUCPzftiwPP/YL3x/1688f9buO3/Va3h/0yd0f9Ilsn/S53R/1St4v9euu7/ZMHz/2fD9f9pxfb/bMf3/2/J+P9xzPr/csz6/1ar3f85h77/N4a9/z2Z1v9VtO3/bMPx/1ij0P9Ims//L5PX/y2S2P8tktj/LpPY/y+U2f8xldr/M5fb/zWZ3P84m97/O57f/z6f3v9AnNj/QJfR/0CWz/9Am9b/QaDe/z+h4f89oOD/O57f/zmd3/8meL/7Dj98bwAAAAQAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAABw4+enNCkM77ZcP1/2G87/9ZsOL/UKDS/0uazf9MoNX/Uq3k/1i27f9cuvD/YL3x/2O/8/9mwvT/acX2/2zH9/9uyfj/ccv5/3PN+/9yy/n/UaPW/ziGvf88k87/V7Xt/2i86f9Tn87/NpXV/yyS2P8tktj/LZLY/y+U2f8xldr/M5fb/zWZ3P83m93/Op3f/z2f4P9AouL/Q6Xk/0an5P9Ip+L/R6Lb/0Sd1v9BnNf/Pp7c/zye3/86nuD/J3i/+ww1aIMAAAAgAAAAEgAAAAgAAAADAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAJAAAAFAAAACcLM2WJQY3K/F605P9To9P/TJzP/0qi2P9NquP/UbDq/1S07P9Ytu7/W7nv/1+88f9iv/L/ZcL0/2jE9f9rx/f/bsn4/3DL+f9yzPr/dM78/2/I9v9KnM//Oo3F/1e06v9ist//QZjS/y2S2P8tktj/LZLY/y+T2f8wldr/Mpfb/zWZ3P83m93/Op3e/z2f4P9AouH/Q6Tj/0an5P9Jqub/TK3o/1Cw6v9Tser/U6/n/0+q4f9HpN//QKLg/yh5v/0KMGO0AAYOZwAAAEgAAAAwAAAAHAAAAAwAAAACAAAAAAAAAAAAAAABAAAABAAAAAwAAAAaAAAALwAAAEwDECF2DTlwwjZ+u/5Mn9T/RqDa/0am4v9Jqub/Ta3o/1Cw6v9Us+v/V7bt/1u57v9evPH/Yr/y/2XB9P9oxPX/a8b2/23I+P9wy/n/csz6/3PN+/91z/z/a8Px/0WXzP9UrOD/UabZ/y+S1/8tktj/LZLY/y+T2f8wldr/Mpbb/zSY3P83mt3/OZze/zyf4P8/oeH/QqTi/0Wm5P9IqeX/TKzn/0+v6f9Sser/VrTs/1m37v9duvD/X7vw/1267v9Motz/L3Sz9xpQi90LMV+1AxcyhwAGD1QAAAAjAAAACAMLFgAOQn8AAAAABQAAABYAAAAyAQQIWAYZMoYNNmi8GFWX6CV1uvw3k9T/P6Hg/0Gj4/9FpuT/SKnl/0ys5/9Pr+n/U7Lr/1e17P9auO//Xrvw/2G+8v9kwfP/Z8P1/2rG9v9tyPj/cMr5/3LM+v9zzfv/dM77/3XP/P9nvu3/U6jc/zmZ2f8sktj/LZLY/y6T2f8wldn/Mpba/zSY2/82mt3/OZze/zye3/8/oeH/QqTi/0Wm5P9IqeX/S6vn/06u6P9Sser/VbTs/1i27f9cue//X7zx/2K/8v9lwfT/aMX2/2jD9f9dtOn/SJbQ/y5wrvMaUIzNDz10eggjSBMVXLcAAAAAAAAAAAkEFCg2CSdOhxBBecsaXqPxJnvC/zGR1v84m97/O57f/z6g4P9Bo+L/RKXj/0ip5f9LrOf/T6/p/1Ox6/9WtOz/Wrfu/1268P9gvvH/ZMDz/2fD9f9qxfb/bcj3/2/J+P9xy/r/c837/3XP/P90zvv/Z8Hw/z+b1P8pjdH/LZLY/y+U2v8wldr/Mpba/zSY2/82mt3/OJze/zue3/8+oeD/QaPi/0Sm5P9IqOX/S6vn/06u6P9Rser/VbPs/1i27f9bue//Xrzw/2G+8v9kwfP/Z8P1/2rF9v9syPj/b8v5/3LN+/9vyfj/Wq3j/yJjqN8JPH4pD0eNABNPmgAOOXIfFE+VuB1psPYngcn/LpHX/zKY3P81mdz/N5vd/zqd3v89oOD/QKLi/0Sl4/9HqOX/Sqvn/06u6f9Sser/VbTs/1m37v9cuvD/YL3x/2PA8v9mwvT/acX2/2zH9/9vyvn/cs37/3DK+P9duOn/OpfN/xt5tP8Obar/EXCw/xd0sf8gf73/LY/S/zOX2/83m97/OJze/zue3/8+oOD/QaPi/0Sm4/9HqOX/Sqvn/02u6P9RsOr/VLPr/1e27f9bue//Xrvw/2G+8v9kwfP/Z8P1/2rF9v9sx/f/bsn4/3DL+f9yzfr/dc/8/0+e1/4YVZyPAC9qCA1DgwARR4sADz+BGxZWoMMmgMj/LpXa/zCU2v8yltr/NJjb/zea3f85nN7/PJ/f/0Ci4f9DpOP/Rqfk/0qq5/9Nrej/UbHq/1W07P9Yt+7/XLrv/1+88f9iv/L/ZsL0/2rG9v9tyPj/Z8Ly/1Gt4P8ujMX/FHOw/wtrqv8Ma6v/DW2s/w1trP8HX5b/BFaH/wtglP8Zc6v/KYfF/zaY2P8+oOH/QaPj/0Sl5P9HqOX/Sqrm/02t6P9QsOr/VLPr/1e27f9auO7/Xbvw/2G+8v9jwPP/ZsP0/2nF9v9sx/f/bsn4/3DL+f9yzPr/dc/8/2O46/8kZqvKBzp/Iw9IkQAbY8EADkF3ABVSpgAQRos6GV+p1ymIz/8wldr/MZXa/zOY2/82md3/OZze/zyf3/8/oeH/QqTi/0an5P9Jqub/Ta3o/1Gw6f9Us+z/WLbt/1u57/9fvPH/Y8D0/2XB9P9buOv/QZ7U/yKAu/8Qb63/C2yr/w1trf8Obq7/Dm+v/w5vsf8OcLH/CGGZ/wNUhP8CVIT/A1WF/wZajP8QZ53/IX23/zSTz/9Co+D/Sqvn/06u6f9QsOr/U7Lr/1a17f9auO7/Xbvw/2C98f9jwPP/ZsL0/2nE9v9rx/f/bsn4/3DK+f9yzPr/dM77/3DJ9/84gMDvDUaNVCJs0wAJSIYAAAAAABJQlwAjnP8AU///ABFIj1EbZa/nLI3T/zGW2/8zl9v/Npnc/zic3v87nt//PqHh/0Kk4/9Fp+T/SKnm/0ys5/9Qr+n/U7Lr/1i27f9cuvD/W7nu/02q4P8yj8j/GHez/w1sq/8MbKv/DW6u/w5vr/8OcLH/DnGy/w5wr/8Pb6D/Dm6p/wdgmf8CVIb/A1WG/wRUhf8EU4P/BVSF/wZZjP8LYpj/F3Kr/yuJw/9AoNr/T6/o/1e27f9auO//Xbrw/2C98f9iv/P/ZcL0/2jE9f9rxvf/bcj4/2/K+f9yzPr/c837/3XP/P9Pn9f/FlKZlAAaQgwAAAABAAEDAAAAAAAAAQEAAAAAAgAAAAYABAwKEUmOcR9ttfQvktf/M5fb/zWZ3P84m93/O57f/z6g4P9Bo+L/RKbk/0ip5f9MrOj/ULDq/1Sz6/9Qrub/PpzU/ySCvP8Rb6z/C2qo/wxsqv8Nbq3/Dm+v/w5wsf8PcbL/D3K0/w9ytv8UeI7/K6pi/yahaf8Yf2r/C2Js/wVXeP8DT3v/A0Vv/wRDa/8FSnX/BlKB/wdZjP8JYJf/EGum/yB+uv84l9L/Tq3l/1277/9jwPP/ZsL0/2jE9f9rxvb/bcj3/2/K+f9xzPr/c836/3XQ/P9kuuz/JGWo0gUoVjQAAAAKAAAABQEEBwEAAAAAAQMGAQAAAAQAAAAOAAAAFAIIEh8SSYuVI3S8+zKW2v81mdz/N5vd/zqd3/89oOD/QaLi/0Sm5P9Jqeb/S6vn/0Wj3f8xjsj/Gnex/wxqpv8Kaab/DGup/w1trP8Ob67/DnCw/w5xsv8PcrT/D3O2/xB0t/8Pc7j/GoZ5/z/ga/9B53D/Pd1q/zbIYv8qq1z/HYhZ/xFjUP8JRkv/BTtS/wU9X/8GQ2z/CE15/wlWh/8KXpb/DWmm/xd4uP8qjcz/RKTf/1u57v9pxfX/bsn4/3DK+f9xy/r/cs36/3TO+/9xyvj/OH++8Qs4cHYIJEg+D0F+WA9AeyTr//8ABAgPABhoygAQRIMhEUqQjRBEhH8MNGVYCCVLTxNMjrknfMP+NZnc/zeb3f86nd7/PaDg/0Gj4/9Bo+H/OJfT/yWBu/8Sbqj/Cmah/wpno/8Laab/DGup/w1trP8Nb67/DnCx/w9xs/8Pc7X/EHS3/xB1uP8Qdrr/EHW8/xqGff893Gn/QOVw/z/jb/8/427/PuFs/zzbaP83zmL/L7dY/yKRTP8PVD3/CUNH/wc8V/8HP2P/CEhx/wtXif8Oaqj/D3W6/xN6wf8ehsv/NJna/1Cw6f9mw/T/csz6/3XP/P920Pz/T57W/xVRmeYTTJC8FVOc4BRSnu4SSpFmHH7tAAcWNAASTZUAEEiLKxNQm8QUU57xFlag8xZWndsUUJXRF1ii+iuEyv83m97/Op3f/ziZ2f8sisf/GnWu/wxmn/8IYpv/CWWf/wtnov8LaaX/DGuo/w1sq/8Nbq7/DnCw/w9xs/8Pc7X/EHS3/xB2uf8Rdrv/EXe9/xF3v/8ahX//PNlo/z/ibv8+4W3/Pd9s/zzda/8722n/Otlo/zrZZ/80yF7/GHIz/xFeKf8LSUD/BjVV/wc7Xf8KTHj/Dmik/xF3u/8Se8L/E33F/xN+yf8Xg87/JI/X/zyi4v9Zue//Ybvu/yp0uf8aYKr/GFyn8BVUnroSTZRqEEaIGBZWoQAAETkADT57AAs4cwIPRYMZEUuRTBRRmY4XWaPMGmGr8xxkrv8icrr/MJDT/yOCvv8RaqL/CGCW/wdfl/8IYpv/CWSe/wpmof8LaKT/DGqn/wxsqv8Nbq3/Dm+w/w9xsv8Pc7X/EHS4/xB2uv8Rd7z/EXi+/xJ5wP8RecH/GoWA/zrWZv8+4G3/Pd5s/zzda/8722r/Otlo/znXZv841WX/JZ1J/xJiLP8SXyr/C0ZB/wY1Vf8IPmH/C1SF/w9trP8Rd7z/EnvC/xN9xv8Uf8r/FYLN/xaE0f8ahdH/IoPM/yd4vvsaX6nXFVOckhFKkEUNPn4QHnnkABFGigAZYbQAABI3AA9EhQAOQH4AEEiMABRRnAAACyUCDT+AGBFKj0kVU5uLGV2myR5rs/Eab7L/FG2q/w5oof8JZJz/CWOc/wpln/8KZ6L/C2ml/wxrqP8Nbav/Dm+u/w9xsf8PcrT/EHS3/xB2uv8Rd7z/EXi+/xJ6wP8Se8L/EnrF/xqFgv8502T/PN1r/zzcav8722n/Otlo/znXZv851mX/LrhW/xVsMP8RXyr/DlA2/wY2T/8GNlb/CERs/wxfl/8PcrP/EXe8/xJ6wP8TfcX/F4HK/xyCzP8eecP/HGmz7hdZorcRSpJpDkGFJQEdSAQTUp4AEEaJAAwzZAAOPHUAAAAAAAAAAAAAAAAAAAAAAAAmTQAAAAAADj97ABBGiwAUUp0AAAAEAgw8fhcQR45IFVKbihldpscbZ6/wGW2w/xRurP8Oa6f/DGml/wtppv8Ma6n/DW2t/w5wsP8PcbP/D3O2/xB1uf8Rd7z/EXi+/xJ6wf8Te8P/E3zE/xN8x/8ahYb/N9Bi/zvbaf862Wj/Othn/znWZv841WX/N9Nj/yKSQ/8RXyn/EVou/wc6SP8FMlH/BjZV/whFbf8MYZn/D3Gz/xF3u/8WfMH/G3rC/x1wuvoaYarXFVKakhBGjUQMOHkPHHjYABFHjQAOQX8AAAAAAAopUgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHjwAAAAAAA89egAQRosAFFGdAAAAAAEMOnwWEUiORhVSm4cYXKXGGWat7xhssP8Ub7D/EG+u/w5wr/8OcLH/D3K0/xB0t/8Qdrr/EXi9/xJ5wP8Te8L/E3zE/xR+xv8Ufsr/GYSK/zbNYP862Gf/OdZm/znVZf841GT/N9Jj/zbRYv8qrVD/E2Us/xFcLf8HPEb/BTJQ/wY1U/8HP2P/DFmN/xRxsf8acrj/G2ew7RdZorcTTJRpD0GGJAMbQwMTUZ8AEEWJAA0wZQAPOnYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB48AAAAAAANPXcAD0WJABRSnQAAAAABDDp7FhFIjUQUUZqFF1ukxBhkrO4XbLH/FHK1/xF0t/8Qdrn/EHe8/xF4vv8SesH/E3zE/xN9xv8Uf8j/FH/M/xmEi/80yV3/ONRl/zjTZP830mP/N9Fi/zbPYf81zWD/MsZc/xt/Ov8RYCn/DU83/wU0T/8HNVT/Czte/xFIePsVVJXaFVKZkBFHjUMNOXgPHXLXABFIjgAQQX4AAAAAAAopRwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARMwAAAAAADj14ABBFiQAUUJsAAAAAAQ07fBURR41CFFGZhBZao8IXZKztFm20/xR0u/8TecD/E3vD/xN9xf8Ufsj/FH/K/xWAzv8ZhI3/M8Zc/zfRYv820GL/Ns9h/zXOYP80zF//NMpe/zPKXf8oqU3/E2Yt/xFdK/8MQkb+Ci5S9QkmRtkHHjmlBRgwUAEEDw0YZMEAEEKCAA01YwAOPXUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFSsAh///AA08dAAQRooAE0+aAAAAAAENOnsUEUeNQBRPl4EVWKLAFmOs7RVut/8VeMH/FH7I/xWBy/8Vgc//GYOQ/zHBWf81zmD/NMxf/zTLX/8zyl7/M8ld/zLHXP8xxlr/L8FY/x2GPP8RYCr/EVYu9wYhI64AAgeEAAAAdwAAAFUAAAAiAAAABgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABcuAFP//wAMPHUAEEWJABNPmQAAAAAADTt5ExJHjD8TT5h/FFiivxVjruwVcbv/FXzK/xiCkf8vvVf/M8te/zPJXf8yyF3/Msdc/zHGW/8xxFr/MMNZ/y/CWP8psE//FXAy/xFgKv4OSyDMAgoEhQAAAH4AAABxAAAARgAAABgAAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAmsP8ADDhuABBFiAATT5gA////AA86ehIRRoo9E0+XgBRZp8QXb3vzLrpV/zLHW/8yxlv/McVa/zDEWf8ww1n/L8FY/y/AV/8uvlX/Lb1U/yOcRf8TZi3/El8q/A1CHcEBBwODAAAAfAAAAGoAAAA9AAAAFAAAAAMAAAAAAAAAAAAAAAAAAAAADlgkABBdKAAAZyQAK1UrAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHoD+AA06dAARRYkAE06XAAAAAAALLIkTGG9Mhiy4VPwwwlj/LrtV/zDCWP8vwVf/LsBW/y6+Vf8tvVX/LLtT/yy6Uv8qt1H/H48//xJjLP8SXir7DEIdwQIKBIUAAAB6AAAAZgAAAD0AAAAYAAAABwAAAAEBBQIBAAAAAAAAAAENTiEDAEkbAO9JOAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABx97QANPnMAG3xVABp+Nl8stlL6J6dL/xt+OP8rs1D/Lr9W/y28VP8su1T/LLpT/yu4Uf8qt1D/KbVP/yiyTf8dijz/EmQs/xFfKvwOTCHPBRsMkgAAAHoAAABoAAAASQAAACoAAAAXAAAADgEMBhQTai5kFGsvWAAAAAASVykAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB2IPAAZejZYJqZK+Rp6Nv0TXinlHok92yu3Uf8sulP/K7hR/yq3Uf8qtk//KbRP/yizTf8osUz/Jq5L/x6QPv8Uai//EmAq/xBXJukLPBq3BRsMkAEIA3cAAQBhAAAATwQcDFMTZyycGX823BRtME4ZizgAEVYqAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVcjIAE2wvHhl4NYEUYyxsEl4qNhJlLDkhlULNKbRP/yq2UP8ptE7/KLNO/yiyTf8nsEz/Jq9L/yatSv8lrEn/IJxC/xh9Nv8TaS7/EmEr/RFZJ+4PTiLWDkYexhBRI8IZezTeHZI9+Bd6NIEGNxoFEFwpABFWKgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALdBRABuOOQAAAAABHnAyABJdKQAkmkMAE2svPSCUQdEnr0z/KLJN/yewTP8nr0v/Jq5K/yWtSf8lq0j/JKpI/ySqR/8jp0X/IJtB/xyNO/8ahjj/G4Y4/x2OO/8gnEH/IJxB/Bl/N5kOUyUREmMtABRlMQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA1OJwANTScADFImAAhaJgAMWCcACEghADTIVQASZy42HYw9wSWoSP8mr0v/Jq1K/yWsSf8kqkj/JKlH/yOoRv8jp0b/IqZF/yKmRP8ipkT/IqZE/yKnRf8ipkX/Hpc/8Rd7NYcPUyYSFGwtACGVOgAAVQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA1ZKAAIRyEAG4g7ABBeKiIagDiUIJpC7iSoR/8kq0j/JKlH/yOoRv8jp0X/IqZF/yKlRP8ipUT/IqZE/yKlRP8hnkH+HIs7zhVxMVwHQx8IE2MsACifNwALSisAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD1cnAAYyGQAUbS8ABz8dCBRuMEoahDmlHpU/5CGfQ/shokP/IqND/yKjQ/8io0P/IaBC/x+ZQPQcjDvNF3k0fBJgKyQ06VsAD1wpABVpLQAAVSsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANTSYAG443AA9dKQAagzcABkIdCRJmLTIWdTNqGX01khqCN50ahDigGYA2nhd2M4QVcDBPD10pHAAAAAEUbC8AC0wkABBaKQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKUSYAADIdAA9fKQAVcTEAH6FGAAAAAAIAFQ8FABoPBgACBQX///8AGYQ3ABJoLQAMVSUAEnUzAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD1AiAA9NIAAOUyUADVUnAAxTJQALSSEACDYaAAAAAAAADQ0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA///////////////////////////////////////////////wH////////8AD///////+AAB///////gAAA//////wAAAAf////8AAAAAP///+AAAAAAP///gAAAAAAH//4AAAAAAAD/8AAAAAAAAH/wAAAAAAAAf/AAAAAAAAB/8AAAAAAAAH/wAAAAAAAAf/AAAAAAAAB/8AAAAAAAAH/wAAAAAAAAf/AAAAAAAAB/8AAAAAAAAH/wAAAAAAAAf/AAAAAAAAB/4AAAAAAAAA+AAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwAAAAAAAAA/4AAAAAAAAf/8AAAAAAAH//+AAAAAAD////AAAAAAH////gAAAAAP////wAAAAAB////4AAAAAH////8AAAAAf////8AAAAB/////4AAAAH/////gAAAA/////+AAAAD//////wAAAf//////gAAD///////AAA////////AAH////////gD////////////////////////////////////////////8='

#获取程序名
all_name=os.path.abspath(sys.argv[0]).replace("\\",'/').split("/")[-1]

#程序后缀
suffix=all_name.split(".")[-1]
#程序名
name=all_name[0:-len(suffix)-1]

#当前文件夹没有ico则生成ico
if os.path.isfile(name+".ico")==False:
    with open(name+".ico",'wb') as f:
        f.write(b64decode(base64_ico))


class Application(tk.Frame):
    def __init__(self, master=None):
        super().__init__(master)
        self.file = None
        self.cmdParameter = {
            '-F': True,  # 将资源文件,.py文件打包成一个可运行文件
            '--i': None,  # ico文件位置
            '-n': None,  # 生成运行文件名称默认为源.py文件名
            '-workpath': None,  # 中间文件生成位置
            '-distpath': None,  # 目标文件生成位置
            '-a': False,  # 不包含unicode支持
            '--key': None,  # 指定加密的字符串16位
            '-d': None,  # 生成打包日志
            '-w':True,#没有控制台0 ==True 1==False
            '''
                follow for windows
            '''
            '–version-file': None,  # 添加版本信息.txt
            '--manifest': None,
        }
        self.w_v=tk.IntVar()
        self.f_v=tk.IntVar()
        self.f_v.set(1)
        self.w_v.set(0)
        self.master.title("AutoPackage-1.0")
        self.master.geometry("420x240")
        # self.master['background']="#000"
        self.grid()
        self.master.iconbitmap(name+".ico")
        self.create_widgets()

    def create_widgets(self):

        self.mainLabel = tk.Label(self,text="AutoPackAge(pyInstaller打包辅助)").grid(row=0, column=0,columnspan=3)

        self.fileLabel = tk.Label(self,text="选择py文件!").grid(row=1, column=0)

        self.filePathBox = ttk.Entry(self,width="32",)
        self.filePathBox.grid(row=1, column=1)

        self.cBtn = tk.Button(self,text="   选择   ",relief=tk.GROOVE,command=self.choosePyFile)
        self.cBtn.grid(row=1, column=2)

        self.setImgLabel = tk.Label(self,text=" 设置ico :")
        self.setImgLabel.grid(row=3, column=0)

        self.icoImg = tk.Entry(self,width=32,)
        self.icoImg.grid(row=3, column=1, rowspan=2)

        self.cImgBtn = tk.Button(self,text="选择图标",relief=tk.GROOVE,justify=tk.CENTER,command=self.setIco)
        self.cImgBtn.grid(row=3, column=2, padx=0, pady=0)

        self.oLabel = tk.Label(self,text="exe文件名:").grid(row=5, column=0)

        self.outFileName = tk.Entry(self,width="32")
        self.outFileName.grid(row=5, column=1)

        self.outBtn = tk.Button(self,text="   确定   ",relief=tk.GROOVE,command=self.set_out_name,)
        self.outBtn.grid(row=5, column=2)

        self.f_btn = tk.Checkbutton(self,text="打包成独立exe",variable=self.f_v,onvalue=1,offvalue=0,command=self.c_F_event)
        self.f_btn.grid(row=6, column=0)

        self.w_btn=tk.Checkbutton(self,text="控制台程序",variable=self.w_v,onvalue=1,offvalue=0,command=self.c_w_event)
        self.w_btn.grid(row=6,column=1)
        self.Label = tk.Label(self,text="添加16位密钥",).grid(row=7, column=0)
        self.keyTextBox = tk.Entry(self,width=32,)
        self.keyTextBox.grid(row=7, column=1)
        self.keyButton = tk.Button(self,text="   确定   ",padx=0,pady=0,relief=tk.GROOVE,command=self.set_key).grid(row=7, column=2)
        self.createBtn = tk.Button(self,text="   生成.exe可执行程序   ",
            relief=tk.GROOVE,
            command=self.createExe
        ).grid(row=8, column=0, columnspan=3)

    def c_w_event(self):
        if self.w_v.get()==1:
            self.cmdParameter['-w']=False
        else:
            self.cmdParameter['-w']=True

    def set_out_name(self):
        self.cmdParameter['-n'] = None

    def set_key(self):
        if self.file == None or self.file == "":
            messagebox.showinfo(name+"消息提示", "请先选择打包文件")
        else:
            md = hashlib.md5()
            with open(self.file, 'rb') as f:
                while 1:
                    data = f.read(1024)
                    if data:
                        md.update(data)
                    else:
                        break
            self.cmdParameter['--key'] = md.hexdigest()[0:16]
            self.keyTextBox.insert(0, self.cmdParameter['--key'])
            print(self.cmdParameter['--key'])
            with open("key.txt", "w") as f:
                f.write(self.cmdParameter['--key'])

    def c_F_event(self):
        if self.f_v.get()==1:
            self.cmdParameter['-F']=True
        else:
            self.cmdParameter['-F']=False

    def setIco(self):
        fname = filedialog.askopenfilename()
        if 'ico' in fname.split(".")[-1]:
            self.icoImg.insert(-1, fname)
            self.cmdParameter['--i'] = fname
        else:
            messagebox.showinfo("AutoPackage提示消息", "不是ico图标文件")
    def createExe(self):
        if self.file == None or self.file == "":
            messagebox.showinfo("AutoPackage消息提示", "请先选择py文件!")
            return
        cmd = "pyinstaller "
        for key in self.cmdParameter.keys():
            if self.cmdParameter[key] == True:
                cmd += key
                cmd += " "
            if type(self.cmdParameter[key]) != type(True) and self.cmdParameter[key] != None:
                cmd += key
                cmd += " "
                cmd += self.cmdParameter[key]
                cmd += " "
        cmd += self.file
        print(cmd)
        st = os.popen(cmd).read()
        if "ERROR" not in st:
            messagebox.showinfo(name+"消息提示", "文件打包完成!")
        else:
            print(st)
            messagebox.showinfo(name+"消息提示", "打包失败!")

    def choosePyFile(self):
        fname = filedialog.askopenfilename()
        if "py" in fname.split(".")[-1]:
            self.filePathBox.delete(0,tk.END)
            self.filePathBox.insert(0, fname)
            self.file = fname
            self.outFile = fname
            self.outFileName.delete(0,tk.END)
            self.outFileName.insert(0, fname)
        else:
            messagebox.showinfo(name+"消息提示", "文件不符合要求")







if __name__ == "__main__":
    root = tk.Tk()
    app = Application(master=root)
    app.mainloop()

  

使用说明

python tkiner实现自动打包程序

 

 若要生成控制台程序,请打勾控制台程序,不勾选的话生成的exe程序执行是看不到控制台的,报错的话当然也看不到,会闪退

添加密钥点击确定就行,本人在这里是获得.py文件的md5的值,然后选择前面16位,至于加密,可以自己随便写了,最后确保是16位字符串就行

点击确定就行

一定要勾选打包成独立exe程序(默认是勾选的),这个选项是为了以后扩展,有很大一部分内容我没有写

这个程序本来是为了练习tkinter的,写完也没有再修改或者增加,肯定有很多不足之处,请见谅。

 

上一篇:如何在Python中更改TkTable中活动单元格的文本颜色?


下一篇:Tkinter之Scale