【问题标题】:Should I mix wxpython and pyobjc?我应该混合使用 wxpython 和 pyobjc 吗?
【发布时间】:2010-04-01 14:42:53
【问题描述】:

我有一个基于 wxPython 的应用程序,我将它移植到 Mac OS X,因为我需要显示一些看起来像本机 mac 警报的警报,所以我使用 pyobjc 来做这个,例如

import Cocoa

import wx

app = wx.PySimpleApp()
frame = wx.Frame(None, title="mac alert test")
app.SetTopWindow(frame)
frame.Show()

def onclick(event):
    Cocoa.CFUserNotificationDisplayAlert(0, 3, 0, 0, 0, "Should i mix wxpython and objc", "hmmm...", 
                                         "Cool", "Not Cool", "Whatever")

frame.Bind(wx.EVT_LEFT_DOWN, onclick)
app.MainLoop()

这样混用wx和objc代码有什么问题吗,有什么故障点吗?

【问题讨论】:

  • wxPython 在 Mac 中看起来不是原生的?那失败了!由于 wxWidgets 声称 "wxWidgets gives its applications a truly native look and feel because it uses the platform's native API"
  • 它提供原生外观,但不允许微调,例如如果在消息框中我想要“恢复”而不是“确定”按钮,这是不可能的,否则我已经创建了一个我自己的对话框,这再次破坏了使用带有原生图标的原生消息框的目的
  • 我认为在这种情况下,您应该向 wx 人员记录错误。为什么不应该将消息框的标题作为可选参数传入。

标签: python objective-c wxpython wxwidgets pyobjc


【解决方案1】:

我认为这不会很好,混合事件循环......

[编辑:我最初是这么想的,因为对话框是模型而它后面的窗口不是,并且可能有两个事件循环争夺控制权。 (因为每个窗口都有自己的窗口,这就是为什么您可以在其中包含 Carbon 和 Cocoa 窗口(主要是其他类型的应用程序)。

另一方面,前面的窗口——你的对话框——控制着整个事件循环(如果它是模型),所以它可以实际工作。]

我真的建议您阅读Carbon/Cocoa Integration guide。现在,这更加困难,因为您使用的是 Python 而不是 C,但它可以解释一些概念。

我认为在之前的项目中,我们实现了类似这样的自己的对话框,包括可自定义的文本。 (因为我们使用的是 wxWidgets/C++,所以我们只是使用带有 wxWidgets 层的 Carbon API 实现了这一点,我们看起来还不错。(...我们有一个经过大量修改的 wx 版本...)

【讨论】:

  • 嗯,但会出什么问题?至少暂时似乎没有什么问题,我还在我的应用程序中添加了一个 NSProgressindicator,它似乎工作正常,如果对话框是模态的,并且在那之后被丢弃,可能不会有问题吗?跨度>
  • @Anurag Uniyal:可能。再次考虑后我更新了答案。
【解决方案2】:

一个可能要问的问题;我相信您必须使用位于 Carbon 之上的 Mac 的 wx 版本,因为我认为 Cocoa 版本尚未发布。一旦可可版本发布(对于 wx),那么我认为必须有“更少”的问题。碳和可可的混合物对我来说听起来有问题,但我无法指出具体的问题。

【讨论】:

  • 是的,当前 wx 使用 Carbon,但无论如何这更多是 API 问题,wx 没有提供可可允许的调整消息的方法
【解决方案3】:

您不只是编写一个继承自 wx.Dialog 的自定义 WX 对话框有什么原因吗? The WX demo has a very nice example of that。更多的工作,但更清洁的方法。

【讨论】:

  • 我已经这样做了,但不知何故,我们决定尽可能多地使用原生对话框,而不是尝试复制和维护它们
猜你喜欢
  • 1970-01-01
  • 2020-07-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-15
  • 2019-03-26
  • 1970-01-01
相关资源
最近更新 更多