构建Mac和Windows图形用户界面应用程序

2024-05-19 00:06:01 发布

您现在位置:Python中文网/ 问答频道 /正文

我计划为Mac和Windows构建一个GUI应用程序。我一直在做一些技术选择方面的研究,比如语言、库和构建工具,以便在两个平台之间尽可能多地共享代码。

主要要求是:

  1. 满足Mac应用商店的要求。
  2. Mac和Windows上的本地外观。
  3. 需要调用Mac上的Quartz窗口服务和Windows上的Windows API。
  4. 使用SQLite存储和读取数据。

我的文章篇幅已经失控,所以我把我的问题作为一个总结移到了顶部,而上下文则在下面。

问题

  1. 为了便于编程,我倾向于使用Python。这是我的正确选择吗?如果不是,为什么C++会更好?如果是这样的话,我该如何设置py2app和pyobjc来编译python并构建一个独立的应用程序来为GUI加载XIBs呢?
  2. 我不应该为了更本机的界面而在Mac上使用跨平台GUI库,这对吗?或者使用QT或wxWidgets会更好吗?
  3. 如果我走错了路和/或有更好的解决方案我没有考虑,请指出:)

到目前为止我的研究和结论

GUI库

对于Mac,我排除了使用跨平台的图形用户界面库(如QT),因为它们似乎无法在Mac上提供本地的外观(看起来不合适和/或难以编写遵循苹果人机界面指南的应用程序)。wxWidgets说它使用本机库,但是这个post提到wxPython可能使用私有的Objective-C调用,不太可能被批准用于Mac应用商店。最后,即使外观正确,两个平台的布局可能仍需要改变。

因此,我计划在Mac界面上使用本地Cocoa GUI库,但仍在考虑在Windows GUI上使用wxWidgets。

语言

对于主要应用逻辑来说,我最好的语言选择是C++或Python。显然,用Python编写跨平台代码比C++更容易,但总是存在折衷。

Python

优点:编写更快,维护更容易。强大的跨平台库,可以大大缩短开发时间。

缺点:使用Python意味着使用PyObjC,它已经有一年多没有更新了(从svn可以看到),我不清楚它是否还能与Xcode和OSX的未来版本一起使用。另外,使用PyObjc和py2app设置任何正常的构建配置,并在Xcode之外为GUI使用xibs也是一个噩梦。

<强> C++ >强>

优点:易于在Mac和Windows上设置生成配置和依赖项。运行速度比Python快得多,不过在我的例子中,性能并不是一个大问题。

:EME>我不知道C++。我对C很好,但是它看起来不太好,我在编写好的C++方面有很大的帮助。我有一个普遍的印象,写跨平台的C++要困难得多,但我可能错了。有很多关于隐秘的bug的帖子。不过,Boost看起来很有希望。

构建工具

如果使用C++作为主要语言,设置两个平台似乎很简单。如果我使用Python,在Windows上设置似乎也很简单,因为我将使用wxWidgets来部署GUI和py2exe。

至于Mac和Python,标准的选择似乎是pyobjc和py2app。不幸的是,我还没有找到任何使用py2app的构建配置示例,该构建配置使用XIBs和Cocoa库,而不是QT或wxWidgets。我不希望Xcode管理构建,因为我希望Python文件和应用程序资源放在 Xcode项目目录。这将大大简化Windows和把文件树弄干净。

关于QT的编辑:我又看了一眼QT,花了几个小时和QT设计器一起玩。基本的UI元素(button、textfield、label)看起来与Cocoa元素相同。我把一个QWindow和一个QTabView简单地组合在一起,它看起来像一个Cocoa应用程序。不过,也有一些负面因素:

  • 行为有点偏离,比如缺乏弹性滚动,QTextEdit没有蓝色阴影表示焦点。
  • QTableView看起来不像它的Cocoa版本。
  • 元素之间的间距,到父视图的间距,不遵循准则。通过调整布局,它基本上是可以修复的,但是需要在任何地方都做,我会免费使用Xcode。
  • 缺少用于生成检查器的HUD元素。这是我很可能需要在我的应用程序,至少在Mac方面。
  • 无障碍支持。

我知道我很挑剔,但要想成为一个好的用户界面,我必须很挑剔。总体来说,QT似乎是Windows的一个很好的解决方案,但我认为我将坚持使用Cocoa for Mac。我对现有程序做了一些额外的研究,发现VLCChromeTransmission都为Mac制作了本地gui,而VLC使用QT作为Windows,Chrome使用自定义框架,Transmission使用GTK+和QT作为Linux。

我想我已经决定使用COMGUI来为Windows和Windows的QT或WxWIDGET使用,但是仍然在C++和Python之间分配共享逻辑。


Tags: 语言应用程序元素windowsmac跨平台gui平台
2条回答

我想你可能太快就排除了Qt的可能性。这个guy报告说他在Mac应用商店发布了一个基于Qt的应用。

根据这个相关的answer,您可以指定Qt构建目标以使用Cocoa,而不是不推荐的Carbon API。

这个Qt bug在版本4.8中已经解决了一个位置未经苹果批准的plist文件。

这个Qt article讨论了为支持Mac的本地外观而引入的特殊功能。


关于C++,通常没有跨平台问题,如果使用诸如Qt或Boost之类的库来抽象平台相关的位(Boo..asio、Booost .FielSoSoC和Booost .Trand),Qt对于网络、文件和线程具有类似的抽象性。

C++绝对是一种“专家友好”的语言。如果可以在Qt上使用Python和PySide绑定,同时还能发布到App Store,那么我猜这可能是您的最佳选择。

如果你最终使用C++,那么我强烈建议你学会使用你所处理的所有设施,这将最小化手动内存管理和原始指针。了解容器类、字符串类和智能(引用计数)指针。

我最终选择了Python来共享逻辑。

在Mac上,我使用py2objc作为桥接器,py2app带有一些定制的打包配置。在Windows上,我直接使用Python和wxWidgets。

这允许我在两个平台上都有原生的ui,并且很好地解决了低级代码的问题。

然而,在开始更令人兴奋的冒险之前,我并没有在应用程序上取得太多进展。如果有读者希望使用这个问题/答案作为参考,我强烈建议您查看列出的所有技术并得出您自己的结论。

相关问题 更多 >

    热门问题