Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/359.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Python中使用dock的基本cocoa应用程序,但不包括Xcode和所有附加功能_Python_Cocoa_Pyobjc_Dock - Fatal编程技术网

在Python中使用dock的基本cocoa应用程序,但不包括Xcode和所有附加功能

在Python中使用dock的基本cocoa应用程序,但不包括Xcode和所有附加功能,python,cocoa,pyobjc,dock,Python,Cocoa,Pyobjc,Dock,似乎,如果我想创建一个非常基本的Cocoa应用程序,并使用dock图标等,我会使用Xcode和GUI构建器(w/PyObjC) 我打算编写的应用程序主要与算法和基本IO有关,因此,与苹果特定的东西关系不大 基本上,应用程序应该定期运行(例如,每3分钟运行一次)。。通过AppleScript获取一些信息,并将HTML文件写入特定目录。我想为这个应用程序添加一个停靠图标。。主要用于显示进程的“状态”(例如,如果出现错误..dock图标上会有一个红旗)。dock图标的另一个优点是,我可以让它在启动时运

似乎,如果我想创建一个非常基本的Cocoa应用程序,并使用dock图标等,我会使用Xcode和GUI构建器(w/PyObjC

我打算编写的应用程序主要与算法和基本IO有关,因此,与苹果特定的东西关系不大

基本上,应用程序应该定期运行(例如,每3分钟运行一次)。。通过AppleScript获取一些信息,并将HTML文件写入特定目录。我想为这个应用程序添加一个停靠图标。。主要用于显示进程的“状态”(例如,如果出现错误..dock图标上会有一个红旗)。dock图标的另一个优点是,我可以让它在启动时运行

以简单的方式定义dock右键单击菜单的额外好处(例如:使用Python可调用列表)


我可以不使用Xcode或GUI构建器而只使用Emacs和Python来实现这一点吗?

,它包含在Mac OS X 10.5和10.6中,非常接近您想要的功能。

Chuck对PyObjC的看法是正确的

然后,您应该阅读此非应用程序方法以更改图标

对于dock菜单,在应用程序委托中实现以下操作。您可以通过编程方式构建NSMenu,以避免使用InterfaceBuilder

安装最新版本,然后制作一个新目录(cd-to),在其中制作一个
HelloWorld.py
文件,例如:

# generic Python imports
import datetime
import os
import sched
import sys
import tempfile
import threading
import time

# need PyObjC on sys.path...:
for d in sys.path:
  if 'Extras' in d:
    sys.path.append(d + '/PyObjC')
    break

# objc-related imports
import objc
from Foundation import *
from AppKit import *
from PyObjCTools import AppHelper

# all stuff related to the repeating-action
thesched = sched.scheduler(time.time, time.sleep)

def tick(n, writer):
  writer(n)
  thesched.enter(20.0, 10, tick, (n+1, writer))
  fd, name = tempfile.mkstemp('.txt', 'hello', '/tmp');
  print 'writing %r' % name
  f = os.fdopen(fd, 'w')
  f.write(datetime.datetime.now().isoformat())
  f.write('\n')
  f.close()

def schedule(writer):
  pool = NSAutoreleasePool.alloc().init()
  thesched.enter(0.0, 10, tick, (1, writer))
  thesched.run()
  # normally you'd want pool.drain() here, but since this function never
  # ends until end of program (thesched.run never returns since each tick
  # schedules a new one) that pool.drain would never execute here;-).

# objc-related stuff
class TheDelegate(NSObject):

  statusbar = None
  state = 'idle'

  def applicationDidFinishLaunching_(self, notification):
    statusbar = NSStatusBar.systemStatusBar()
    self.statusitem = statusbar.statusItemWithLength_(
        NSVariableStatusItemLength)
    self.statusitem.setHighlightMode_(1)
    self.statusitem.setToolTip_('Example')
    self.statusitem.setTitle_('Example')

    self.menu = NSMenu.alloc().init()
    menuitem = NSMenuItem.alloc().initWithTitle_action_keyEquivalent_(
        'Quit', 'terminate:', '')
    self.menu.addItem_(menuitem)
    self.statusitem.setMenu_(self.menu)

  def writer(self, s):
    self.badge.setBadgeLabel_(str(s))


if __name__ == "__main__":
  # prepare and set our delegate
  app = NSApplication.sharedApplication()
  delegate = TheDelegate.alloc().init()
  app.setDelegate_(delegate)
  delegate.badge = app.dockTile()
  delegate.writer(0)

  # on a separate thread, run the scheduler
  t = threading.Thread(target=schedule, args=(delegate.writer,))
  t.setDaemon(1)
  t.start()

  # let her rip!-)
  AppHelper.runEventLoop()
当然,在您的实际代码中,您将每3分钟执行一次自己的定期操作(而不是像我在这里所做的那样每20秒编写一个临时文件)、执行自己的状态更新(而不仅仅是显示到目前为止编写的文件数目的计数器)等等,但我希望这个示例向您展示一个可行的起点

然后在Terminal.App cd中,将其放入包含此源文件的目录,
py2applet--make setup HelloWorld.py
python setup.py py2app-A-p PyObjC

现在,在子目录
dist
中有一个目录
HelloWorld.app
打开dist
并将图标拖到Dock,您就可以全部设置好了(在您自己的机器上——由于
-A
标志,分发到其他机器可能无法工作,但我在没有它的情况下构建时遇到了问题,可能是由于在这台机器周围放置了错误安装的鸡蛋文件;-)。毫无疑问,你会想要定制你的图标&c


这不符合你要求的“额外学分”的要求——已经有很多代码了,我决定停在这里(额外学分可能需要一个新问题)。此外,我不太确定我在这里表演的所有咒语是否都是必要的或有用的;这些文档对于制作一个没有Xcode的pyobjc.app来说是非常重要的,正如您所需要的,所以我从网络上找到的一些示例代码加上大量的尝试和错误将其拼凑在一起。尽管如此,我还是希望它能有所帮助

我当然知道PyObjC。教程developer.apple.com/cocoa/pyobjc.html建议使用Xcode及其GUI生成器。。然而,我想要的只是一个模块(像EasyDialogs一样简单),它可以在Python中使用,而无需额外的工具。@Sridhar:如果您查看我链接到的PyObjC站点,您会发现它根本不需要Xcode。文档假定您需要Xcode。还要注意,我并不是在暗示“pyobjc需要xcode”,只是教程和文档是使用xcode和GUI构建器编写的。。然而,我想在一个独立的文本编辑器中编写纯Python来创建一个带有dock图标和菜单的简单应用程序。我希望你能理解我问题的具体内容。@Sridhar:它说你需要安装Xcode才能获得必要的支持工具。是的,如果您想构建一个接口,您确实需要使用Interface Builder。但它并不要求您在任何时候使用Xcode。您可以在一个独立的文本编辑器中编写Python,并创建一个带有停靠图标和菜单的简单应用程序?如果是,你看过py2app了吗?您可以使用它构建一个应用程序,其中包含Python中可用的大多数ui,包括PyObjC,并且有文档化的方法来创建自定义dock图标。不过,我不知道如何更新Dock。请注意,匿名应用程序也可以在登录时运行:您可以从“帐户系统首选项”窗格编辑登录项列表。@Ned-是的,我指的是Mac GUI应用程序(带有Dock图标和徽章)。我将更仔细地看一看py2app。(还将检查其他UI工具包是否提供更简单的API来与mac dock交互)您需要使用pool.drain()@nail,schedule永不结束,因为scheduler.run永远不会返回(因为每个勾号都会安排另一个勾号),所以我认为在调用scheduler.run之后添加任何内容是没有意义的-我认为应该在那里添加注释以澄清…?经过再三考虑,我继续添加了注释,因为它确实使程序更易于理解。我不知道sched模块是如何工作的,但是根据Cocoa的内存管理规则,您已经分配了内存,因此必须释放(即NSAutoreleasePool drain)。不管怎样,我都会争论把它放在那里。如果tick()发生了变化,不再无限地安排时间,该怎么办?这样可以避免被那样的东西烧焦。