前段时间在重写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()
运行代码,弹出窗口如下:
代码解读:
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)
即可设置图标。
(未完待续)