在早之前,因为比较熟悉Python,就一直用PyQt来写界面,写一些业务上或日常用到的小工具。

主要IDE为PyCharm和Qt Designer,但是其中遇到的问题非常多(一定是我没找到正确的解决方法,老手勿喷,仅吐槽)
比如PyQt的Qlabel原生不支持点击事件,而Qlabel继承自QWidget,QWidget具有鼠标事件,所以可以通过重写Qlabel来实现label的点击事件。
假如重写的Qlabel为MyQlabel,而Qt Designer在生成界面时,label仍然用的是Qlabel,这就导致了,改界面后编译一次,都要手动布局文件里的Qlabel为MyQlabel。实属心累。

其次,因为Qt Designer和PyCharm本身没什么关联性,它也不会检查你的方法有没有引用,代码有没有问题。基本都是到了运行,抛出错误才知道

最后,最大的问题在于,写的工具是自己用还好,别人要用,我要打包成单个exe文件,exe文件里就需要包含Python的运行环境等组件,这直接导致一个小工具体积非常大,再怎么抽掉不用的库都至少20M。

后来我想了想,既然用Python写桌面工具费劲,为什么不花时间学C#直接写原生界面?

终于,花了几天时间过了一遍C#的语法,陆陆续续写了文件批量改名工具、WIFI密码查看器、已装软件列表导出工具,
发现,C#和.NET写界面功能实在是太顺手了(顺手的原因有一大部分是Visual Studio给的)。
举一些例子

海量的原生组件,海量的属性及其海量的事件,拿来就用

比如QLabel具有超过50个事件可用,比如批量多选框原生直接有CheckListBox可以用,具备所有项变化的监听事件,不需要你手动写。
比如Label组件里有LinkLabel直接支持链接,支持跳转网页。
尽管这些组件在PyQt里也能手写代码实现,但是C#的直接支持,为独立开发者节省了非常多的时间,在实际开发中,我真的是把大部分时间都花在业务代码上。而在写PyQt时,我花了不少时间在写控件的交互。

图像 080.png

界面和代码的流畅切换

VS提供的界面设计上手非常快,不看教程的情况,布局很快就能自己调自适应、固定位置等,也都能把大部分控件的属性搞清楚,尤其是双击控件可以跳转到代码中的Click方法位置,调整好控件后双击就能直接写逻辑代码。

在编辑器里,什么变量没被使用,什么方法没使用过,哪个地方可能有null异常,哪里少了半边括号。都标记得很清楚。
还有编辑器那个智能提醒和补全功能,虽然不及最新出的AI代码智能提醒补全,但是它的智能程度也很高,比如写for(就立马能把你前面的变量加入for循环,按TAB直接补全了。
所以对某些函数印象不是很深刻但要用的时候甚至都不需要查API文档,代码编辑器直接提醒了。
还有配置文件,十分贴心的给出了注释,直接按着改,都不需要事先查一下教程。

怪不得有人说刚上手C#,C#还没学完,软件就写出来了。

图像 078.png

十分有用的调试

当你某个地方运行时抛出异常,会直接给出当前的变量值,我之前写Python都是在出现不预期的情况时,手动打印变量(我也没试过IDE有没有这个功能)

图像 079.png

终于可以方便的使用所有Windows API了

所有你能想到的桌面软件功能,都可以用C#实现,而且是条条道路通罗马,比如获取电脑安装的软件,可以遍历program file几个文件夹,也可以读取注册表,也可以通过WMI获取。

清晰的发布功能

写完软件后,要发布为绿色软件,或是单个exe,是要把框架一起打包,还是不打包框架,是要可移植,还是指定CPU位数;都在一个页面里可以自由选择。

图像 077.png

C#跟Python交互十分简单

IronPython库可以在C#代码内嵌python代码,而Python.NET可以调用Python文件、Python库,虽然我还没实际使用到,但是这无疑让我这个Python和C#爱好者狂喜,两门语言都是我喜欢的,而恰好两门语言的交互又如此简单。有一天我肯定会用上。

写出来的软件体积十分小

在不引用三方库的情况,打包出来是几十K,几百K的软件,我想都不敢想,但是C#能做到了。这让我每次写出小工具时,都十分欣慰,写一个小的工具就应该有这么小的体积才合理。

图像 081.png

总计下来就是,用C#做桌面端应用,相当省力,可以更加专注于代码逻辑的编写。如果后面winui3有了设计图功能,那就更能轻松的写出一个具有现代化、简洁美观、毛玻璃效果的应用。