6

Python图形界面美化的方法论

 3 years ago
source link: https://zmister.com/archives/1589.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

很多人都吐槽,使用 Tkinter、PyQt5等工具制作出来的图形界面程序太丑了。既然觉得它丑,我们来想想,它为什么会那么丑。

文章目录 [显示]

功能性是开发的第一要务

每一个 Python 图形界面库都有它自有的功能特性和界面特性。一般来说,这些库的开发者着重要考虑的是功能性的实现。比如、列表框、拖拽框、悬浮框、自定义控件、webview等。

一个图形界面库,受不受开发者的欢迎,首先在于它提供的功能是否全面和强大。

如果仅仅是炫酷和好看,如果功能上有所缺失,其应用也只能在小范围和特定领域内得到拥簇。会导致一种“初遇时惊艳,永久后坑多”的状态。

2020-09-13_072556.png

模块提供的都是原生组件

为了便于理解,我们在这里把桌面图形界面的开发(以PyQt5为例)和Web前端开发进行一下不严谨的关联对应。

2020-09-13_073030.png
  • PyQt5 中的各种控件(QPushButton、QLineEdit、QCheckBox等)对应于 HTML 中的各类元素标签(<a><p><h>),用于基础结构的编排。
  • PyQt5 中的 QSS 对应于 HTML 中的 CSS,用于对样式的控件。

  • PyQt5 中的信号槽 对应于 HTML 中的 JavaScript,用于对行为交互的控制。

在不引入任何 CSS 和 JavaScript 的情况下,HTML 中编写的任何标签,在浏览器中显示的都是最原始的形状和样式。

<html>
    <h1>州的先生</h1>
    <a href="https://zmister.com"></a>
    <input type="text" placeholder="表单输入框" />
    <button>一个按钮</button>
    <select>
        <option>一个选项</option>
        <option>两个选项</option>
    </select>
</html>

上述 HTML 代码在浏览器中将会显示为如下图所示:

2020-09-13_074443.png

是不是也是很丑不美观?那就对了。没有经过样式定义的 HTML 标签元素就是这样丑。

而现代Web开发中,几乎所有页面的元素标签都是依照设计原型,引用 UI 组件或自写CSS,对界面的外观进行美化的。

下图是比较知名的前端 UI 库 ElementUI 提供的按钮组件:

2020-09-13_075100.png

通过审查元素,可以看到,其用 CSS 对按钮元素进行了很多改造:

2020-09-13_075340.png

同理,在 Python 的图形界面开发中,我们仅仅是使用了库提供的原生控件和布局,将一个图形界面元素的基础框架构建出来了,并没有对其样式进行任何美化和修饰。这样编写出来的图形界面程序,肯定会让人觉得丑。

界面的美化的几个关键点

通过上面对 Web 页面的对应,我们知道了我们编写的图形界面程序为什么不美观。

如何解决,州的先生根据实际经验给出如下的建议:

有一个好的设计原型

不是要大家去兼修 UI 设计,而是在构建一个图形界面之前,对程序的布局,结构有一个清晰明确的原型。就算是使用网格布局,也应该设计好各个控件在网格的位置和距离。

在有原型之后,可以参考一下现有的消费端桌面软件(QQ音乐之类的)或者上站酷之类的设计网站上看看专业 UI 设计师作品的样式和色彩搭配。

2020-09-13_081223.png

在这里,色彩搭配是一个雷区。好的色彩搭配让程序界面赏心悦目,差的色彩搭配,让人觉得粗制滥造。

充分利用QSS

Qt 提供了 QSS 这个特性让开发者可以自定义小部件的外观,其支持各种属性、子状态和控件。

充分利用好 QSS 来配置界面,图形界面的美化工作可以完成 80% 到 90%。

QSS 支持很多种控件进行配置,由于列表过长,在此就不一一列举出来。贴出 Qt 官方文档中关于 Qt Style Sheets Reference 的链接,大家可以在上面查看:

https://doc.qt.io/qt-5/stylesheet-reference.html

同时,Qt 官方文档中还提供了很多控件使用 QSS 美化的示例,大家也可以参考一下,链接为:

https://doc.qt.io/qtforpython/overviews/stylesheet-examples.html

利用控件的自有属性

QSS 能够完成 80% 到 90% 的界面美化工作,但是还有 10% 到 20% 的场景,QSS 表示心有余而力不足。

什么场景呢?比如窗口边框的处理、窗口默认三剑客(最小化、最大化、关闭)的处理。

面对这一类的处理,就得利用各个控件的自有属性来配置了。如果知道控件的自有属性有哪些呢?答案当然还是看文档。在此个例子:

QProgressBar()是进度栏控件,它的默认样式如下图所示:

2020-09-13_083524.png

我们在官方文档中可以看到它有如下的方法可供调用:

2020-09-13_083741.png

显然,那几个set开头的方法,就是可以直接对控件进行配置的方法:

  • setAlignment():用于设置进度条的对其方式;
  • setFormat():用于设置进度条的文本格式;
  • setInvertedAppearance():用于设计进度条是否反转增长;
  • setMaximum():用于设置进度条的最大值;
  • setMinimum():用于设置进度条的最小值;
  • setOrientation():用于设置进度条的布局,是水平还是垂直;

这样,通过控件的自有属性,我们可以对控件的那些QSS无法处理的基础样式进行自定义。

总而言之,需要多翻阅文档。

最后,用一个 PyQt5 美化的音乐播放器界面镇文,希望大家编写的图形界面程序都德艺双馨,秀外慧中。

2020-09-13_085510.png

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK