Frage

Es scheint, dass ich, wenn ich eine sehr einfache Kakaoanmeldung mit einem Dock -Symbol und dergleichen erstellen möchte, ich würde benutzen müssen Xcode und der GUI -Builder (w/ Pyobjc).

Die Anwendung, die ich schreiben möchte, befasst sich größtenteils mit Algorithmen und grundlegenden IOs - und daher nicht hauptsächlich mit Apple -spezifischen Dingen zu tun.

Grundsätzlich soll die Anwendung regelmäßig ausgeführt werden (z. B. alle 3 Minuten). Ziehen Sie einige Informationen über AppleScript und schreiben Sie HTML -Dateien in ein bestimmtes Verzeichnis. Ich möchte ein Dock -Symbol für diese Anwendung hinzufügen. Hauptsächlich zur Anzeige des "Status" des Prozesses (z. B. wenn ein Fehler vorliegt. Das Dock -Symbol hätte eine rote Fahne). Ein weiterer Vorteil des Dock -Symbols besteht darin, dass ich es beim Start zum Laufen bringen kann.

Zusätzlicher Bonus für die Definition des Dock-Klickmenüs auf einfache Weise (z. B. mit Python-Listen von Anruflisten).

Kann ich dies erreichen, ohne Xcode- oder GUI -Bauherren zu verwenden, aber einfach EMACs und Python zu verwenden?

War es hilfreich?

Lösung

Installieren Sie die neuesten py2app, dann machen Sie ein neues Verzeichnis - CD dazu - darin machen eine HelloWorld.py Datei wie:

# 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()

Natürlich werden Sie in Ihrem wirklichen Code alle 3 Minuten Ihre eigenen regelmäßigen Aktionen ausführen (anstatt alle 20 Sekunden wie ich es hier mache) und Ihre eigenen Statusaktualisierungen durchführen (anstatt nur einen Zähler anzusehen von der Anzahl der bisher geschriebenen Dateien) usw. usw., aber ich hoffe, dieses Beispiel zeigt Ihnen einen praktikablen Ausgangspunkt.

Dann in terminal.app CD zum Verzeichnis, das diese Quelldatei enthält, enthält, py2applet --make-setup HelloWorld.py, python setup.py py2app -A -p PyObjC.

Sie haben jetzt im Unterverzeichnis dist ein Verzeichnis HelloWorld.app; open dist und ziehen Sie das Symbol in das Dock, und Sie sind alle festgelegt (auf Ihrer eigenen Maschine -, die an andere Maschinen verteilt werden -A Flag, aber ich hatte Probleme, ohne sie zu bauen, wahrscheinlich aufgrund falsch installierter Eierdateien, die um diese Maschine herum liegen ;-). Zweifellos möchten Sie Ihr Symbol usw. anpassen.

Dies macht nicht das "zusätzliche Kredit" -Ding, das Sie gefragt haben - es ist bereits viel Code, und ich habe beschlossen, hier anzuhalten (das zusätzliche Kredit kann eine neue Frage rechtfertigen). Das bin ich mir auch nicht ganz sicher alle Die Beschwörung, die ich hier durchführe, sind tatsächlich notwendig oder nützlich. Die Dokumente sind ziemlich bratitant für die Herstellung eines Pyobjc .App ohne Xcode, wie Sie benötigen. Deshalb habe ich dies aus Bits und Teilen von Beispielcode zusammengehackt, die im Netz und eine erhebliche Menge an Versuch und Irrtum gefunden wurden. Trotzdem hoffe ich, dass es hilft!-)

Andere Tipps

Pyobjc, die in Mac OS X 10.5 und 10.6 enthalten ist, ist ziemlich nahe an dem, wonach Sie suchen.

Chuck hat Recht über Pyobjc.

Sie sollten dann über diese NSapplication -Methode lesen, um Ihr Symbol zu ändern.

-(void) setApplicationiconimage: (nsimage *) Animage;

Implementieren Sie für das Menü Dock Folgendes in einem Anwendungsdelegierten. Sie können ein NSMenu programmgesteuert erstellen, um die Verwendung von InterfaceBuilder zu vermeiden.

-(nsmenu *) applicationDockMenu: (nsapplication *) Absender;

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top