还在为怎么把自己写的Python程序分享给不懂编程的朋友而发愁吗?或者不想让别人看到源代码?
PyInstaller就是你的救星!
它能把Python程序打包成一个独立的可执行文件,让其他人可以直接双击运行,就像那些常见的.exe程序一样。
为什么选择PyInstaller?
在介绍具体用法前,我先说说为什么我特别推荐PyInstaller:
傻瓜式操作:基本上一行命令就能搞定
跨平台支持:Windows、Mac、Linux都能用
打包完整:会自动分析并打包所需的依赖库
无需Python环境:用户电脑不需要安装Python就能运行
快速上手
首先,我们需要安装PyInstaller:
pip install pyinstaller
让我们从一个简单的例子开始。假设我们有一个叫hello.py的程序:
import time
def main():
print("你好,这是我的第一个可执行程序!")
time.sleep(2)
print("再见~")
if __name__ == "__main__":
main()
打开命令行,切换到程序所在目录,输入:
pyinstaller -F hello.py
就这么简单!等待几秒钟,你会发现目录下多了两个文件夹:dist和build。可执行文件就在dist文件夹里!
小贴士:-F参数表示生成单个可执行文件,如果不加这个参数,会生成一堆文件。
常用参数详解
PyInstaller还有很多实用的参数,这里介绍最常用的几个:
来个实战例子,做个带图标的小程序:
import tkinter as tk
from tkinter import messagebox
def show_message():
messagebox.showinfo("提示", "你真棒!")
root = tk.Tk()
root.title("我的GUI程序")
btn = tk.Button(root, text="点我!", command=show_message)
btn.pack(pady=20)
root.mainloop()
打包命令:
pyinstaller -F -w -i my_icon.ico --name MyApp gui_demo.py
踩坑指南
在使用PyInstaller时,我踩过不少坑,这里分享几个常见问题的解决方案:
找不到模块
# 在.spec文件中添加
hiddenimports=['包名']
数据文件打包
pyinstaller -F --add-data "images/*;images" main.py
程序闪退
# 在程序最后加上
input("按回车键退出...")
一句话总结
PyInstaller就是把你的Python程序和它所需的一切打包成一个独立的可执行文件的神器!
练习小任务
把我们上面的GUI程序打包成可执行文件,并添加一个自己设计的图标。
尝试打包一个需要读取外部文件(比如图片、配置文件)的程序。
扩展思考
好啦,今天的分享就到这里!希望这篇教程能帮你解决程序打包的烦恼。
纸上得来终觉浅,赶快动手试试吧!如果遇到问题,欢迎在评论区交流讨论~
Qt 控件设置透明和半透明方法汇总
遇到了好多次控件有需要设置为透明和半透明的情况,每次都是去网上搜一搜,看看别人怎么实现的,浪费了很多时间,故在这里进行一个总结,希望对自己有一个提升。
本文对透明的各种情况进行了分类:
看文字也是看的一脸懵逼,这里通过表格的方式再做进一步的阐述。
分类名称窗口透明状态窗口下子控件透明状态
分类一
透明度可调整
透明度跟随窗口透明度变化
分类二
全透明,透明度无法调整
子控件不透明
分类三
窗口的透明度可以调整
子控件不透明
下面分别分对三种方法进行分类汇总:
分类一
此种方法通过调用setWindowOpacity(qreal level)来实现,调用该接口后出整个窗口包括窗口下的子控件的透明度都会发生变化。
分类二
此种方法通多调用setAttribute(Qt::WA_TranslucentBackground)来实现。调用该属性后,该窗口会直接透明,但是该窗口下的子控件不受影响,依然是不透明的。
优点:可以快速的实现窗口的全透明,并且该接口只影响调用属性的控件本身,不影响子控件。
缺点:缺点也很明显,就是不能调整透明度,在某些场景下不太灵活。
注意事项:需要注意的是在对某个控件设置该属性后,只影响控件本身,对子控件或者父控件没有影响,有点时候会很纳闷,明明自己对某个控件设置了该属性,为什么还是感觉没有变透明呢?这里其实已生效了,只是设置该属性的父控件没有设置透明属性而已,为了更好的观察效果,建议对设置该属性的控件的父控件设置一个背景色,这样就很容易的看出是否生效了。
分类三
我个人认为更多时候是使用分类三,以为这种情况下窗口的透明度可以调节,通过设置不同的背景可以实现更好的展示效果,更容易做出漂亮的界面。这里我也对这种情况进行了分类,以窗口为例:
上面两种情况会有不同的方法来实现窗口的半透明,下面将针对每种情况一一进行说明。
窗口背景为指定的颜色(QColor)
这种情况比较简单,直接在ui文件中对窗口设置样式表即可,例如:
#customPageColor{background-color: rgb(170, 170, 255,100);}
上面的引用中可以看到rgb中前三个分别是红、绿、蓝三种颜色,最后一个数字100表示的是透明度,取值范围为(0~255)。感兴趣的朋友可以自行实验下。
需要注意的是如果窗口为顶层窗口,即在UI Designer中没有父窗口并且该窗口是以QWidget为基类时,设置的样式表没有生效。这个手需要在类的构造函数调用setAttribute(Qt::WA_StyledBackground);属性,重新运行样式表就可以生效了。原因是QWidget并么有重新实现paintEvent函数,当然不调用这个属性,重载paintEvent函数也是可以的。感兴趣的朋友可以自行尝试,网上也有相关的教程。
窗口背景为图片
这种情况下就不能简单的通过样式表来完成窗口的透明度设置了,因为图片的样式表并不像QColor一样有透明通道,需要通过其他的方法来实现。通过实验有两种方法可以实现效果。
方法一:
QPainter painter(this);
painter.setOpacity(0.4);
painter.drawPixmap(rect(),QPixmap(":/image/2.jpg"),QRect());
//方法二:该方法也可以实现图片背景的透明度设置,但是此种方法在实战中可能使用价值比较高
QPixmap covert_pixmap(":/image/2.jpg");
QPixmap pixmap(covert_pixmap.width(), covert_pixmap.height());
pixmap.fill(Qt::transparent);
QPainter painter(&pixmap);
QPoint start_point(0, 0);
QPoint end_point(0, pixmap.height());
//QLinearGradient进行渐变色设置
QLinearGradient linear_gradient(start_point, end_point);
linear_gradient.setColorAt(0, QColor(255, 255, 255, 100));
linear_gradient.setColorAt(0.5, QColor(255, 255, 255, 150));
linear_gradient.setColorAt(1, QColor(255, 255, 255, 255));
painter.fillRect(this->rect(), QBrush(linear_gradient));
painter.setCompositionMode(QPainter::CompositionMode_SourceIn);
painter.drawPixmap(0, 0, covert_pixmap);
painter.end();
QPainter painter2(this);
painter2.drawPixmap(0, 0, pixmap);
效果图给大家展示一下,首先是主界面:
上图中的“按钮测试”按钮点后展示的是分类二的全透明效果。原图如下:
设置透明后效果如下所示:
可以看到窗口的背景已经完全透明了,仅显示了两个子控件。
继续点击主界面中的“打开colorPage”按钮,显示的窗口是以指定的颜色为背景色。效果如下所示:
继续点击主界面中的“打开PicPage”按钮,效果如下所示:
代码资源下载地址(无需积分):