与Hello8693一起探索炫彩界面库

前段时间在重写MX工具箱2的时候考虑过UI库的问题,找了半天,找到一个叫“炫彩界面库”的国产库,好像做的界面挺好看,用法还简单,于是我写了这篇文章介绍一下炫彩界面库(下文也叫xcgui)Python版的基本用法。

介绍与注意事项

百度百科:

炫彩界面库是一款强大的软件界面开发框架,让软件UI开发变得简单快速; 并且适用于Windows平台上的所有编程语言。

这句有点吹了,只有可以调用dll的语言才行。

xcgui用了DirectUI思想,所有组件都是自绘的,没有使用Windows组件。这样,我们就可以做更多好看的UI了。

需要注意的是xcgui的窗口没有窗口句柄,不能用win32 api进行操作,也就不能设置亚克力云母等效果以及做有关嵌入窗口的操作了。

有关官网里的“可以使用CSS”:这里指的并不是网页的CSS,而是xcgui的一种样式表,其本质还是个xml文件。官网上的“WebUI”也不属实。

FAQs

为什么我找不到xcgui的源代码?

xcgui是C++写的,而且是闭源软件,你当然看不到源码。

为什么官方的Python Demo无法运行?

最新的XCGUI For Python是最近smallevilbeast大佬的新版,官网上的Python Demo是基于旧版Python XCGUI,自然无法运行。

macOS和Linux怎么办?

xcgui不跨平台,要跨平台还要选PySide6之类的大型库。

UI设计器的付费功能有必要买吗?

没必要。无非就是几个快捷功能而已。

我不是Python用户,怎么办?

请自行寻找其他语言对应的库。

x,y坐标为啥是从左上角到右下角逐渐增大的?

不为啥,绝大多数界面库这样。

安装

如果你还不知道什么是Python,什么是PyPI,什么是virtualenv,请到此打住,下面的内容不适合你。

建议使用Jetbrains PyCharm社区版(如果你是专业版也没问题,这里是因为社区版免费)作为IDE。不熟悉PyCharm的也可以使用自己喜欢的IDE。

下面以PyCharm社区版 2021.2为例进行操作。

创建项目。

创建项目

这里为了方便接下来操作,要选Virtualenv。

进入项目后,点击下方的”终端“,输入:

pip install xcgui

安装过程很快,没有依赖库,只有一个动态链接库而已。

Hello, World!

我们按照传统来写一个HelloWorld程序。

在项目根目录创建 HelloWorld.py ,输入以下内容:

import xcgui
from xcgui import *


class MyWindow(XWindow):
    def __init__(self):
        super(MyWindow, self).__init__(300, 200, "测试窗口")
        self.TestLabel = xcgui.XShapeText(30, 50, 140, 20, "Hello, World!", self)


def main():
    app = XApp()
    mywindow = MyWindow()
    mywindow.showWindow()
    app.run()
    app.exit()


if __name__ == '__main__':
    main()

运行代码,弹出窗口如下:

Hello, World!

代码解读:

import xcgui
from xcgui import *

这两行是导入了xcgui的库文件。

class MyWindow(XWindow):

这一行定义了一个 MyWindow 类,在这个里面我们可以自定义我们的窗口,往里面塞组件。其实如果你不用面向对象也可以,不过这样写结构更清晰,看起来舒服。

def __init__(self):
    super(MyWindow, self).__init__(300, 200, "测试窗口")

这个地方调用了 XWindow 类的初始化方法,创建了一个长300像素、宽200像素、标题为”测试窗口“的窗口。

self.TestLabel = xcgui.XShapeText(30, 50, 140, 20, "Hello, World!", self)

创建了一个叫 TestLabel 的形状文本(即主流界面库里的”标签“),x坐标为30,y坐标为50,宽140像素,高20像素,文字内容是 Hello, World!,父组件为 self

def main():
    app = XApp()
    mywindow = MyWindow()
    mywindow.showWindow()
    app.run()
    app.exit()


if __name__ == '__main__':
    main()

这些代码包括了创建app,创建窗口,运行app等操作。

仅用了这些代码,我们就可以完成一个HelloWorld,是否很好用呢?

XWindow的一些常用操作

下面我来说说关于XWindow类的一些常用小操作。

设置窗口最小大小

如果怕一不小心把窗口缩的太小导致组件溢出,可以在窗口的 __init__ 函数里 super() 的下面写上:

self.setMinimumSize(最小宽度,最小高度)

就可以限制最小的大小了。

举个例子:

import xcgui
from xcgui import *


class MyWindow(XWindow):
    def __init__(self):
        super(MyWindow, self).__init__(300, 200, "测试窗口")
        self.setMinimumSize(250,150) # 新增了这一行
        self.TestLabel = xcgui.XShapeText(30, 50, 140, 20, "Hello, World!", self)


def main():
    app = XApp()
    mywindow = MyWindow()
    mywindow.showWindow()
    app.run()
    app.exit()


if __name__ == '__main__':
    main()

这样最小宽高就被限制住了。

禁用拖动窗口边缘重设窗口大小

如果觉得上面这个还不够用的,可以禁用拖动窗口边缘,也是在窗口的 __init__ 函数里 super() 的下面写上:

self.enableDragBorder(False)

如果程序中间需要再次开启拖动窗口边缘,可以执行:

self.enableDragBorder(True)

即可恢复。

禁用最大化与最小化

这个就稍微有点麻烦了。以上面的 HelloWorld 程序为例,将程序中的

super(MyWindow, self).__init__(300, 200, "测试窗口")

替换成

super(MyWindow, self).__init__(0, 0, 300, 200, "测试窗口",0,xcgui.window_style_default ^ xcgui.window_style_btn_max)

其中的异或运算为去掉某窗口组件。这里异或一个值就是去掉某个东西。如 xcgui.window_style_default ^ xcgui.window_style_btn_max 是去掉最大化按钮,xcgui.window_style_default ^ xcgui.window_style_btn_min 是去掉最小化按钮,而 xcgui.window_style_default ^ xcgui.window_style_btn_max ^ xcgui.window_style_btn_min 就是最大化和最小化按钮都去掉。

设置图标

同样是在 super() 后面、其他组件前面加。

你需要准备 icon.ico 图标文件放在源代码同目录下,然后加上下面几行代码:

self.icoimage = XImage.loadFile("icon.ico")
self.icoimage.setDrawType(xcgui.image_draw_type_fixed_ratio)
self.setIcon(icoimage)

即可设置图标。

(未完待续)


文章作者: Hello8693
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Hello8693 !
  目录