2010-06-23 3 views
6

Ich bin ziemlich neu in der Python-Programmierung und völlig neu in der plattformübergreifenden GUI-Erstellung (nur die vorherige GUI-Erfahrung ist durch Visual Basic und Java). Ich habe einige Python-Code geschrieben, um Daten von einer Website screen-scrape, und jetzt möchte ich eine GUI erstellen , die in der Mac OS X-Menüleiste und in Windows-Taskleiste (d. H. Die Taskleiste).Plattformübergreifende Python-GUI, geeignet für Taskleiste (Win) und Menüleiste (Mac)?

Die nützlichste allgemeine Seite auf plattformübergreifende Python-GUIs für mich war this one (trotz seiner Bezeichnung Window GUIs). Und einige Stackoverflow-Fragen kamen ebenfalls in Frage (vor allem this one, und the accepted answer of this one über die Aufteilung der GUI und CLI-Code). Ich denke, ich werde gehen entweder wxPython oder QT, weil ich möchte die GUI so nativ wie möglich aussehen.

Wie ich schon sagte, wird die ziemlich einfache GUI hauptsächlich in der Taskleiste/Menüleiste zu finden sein. Sollte dies meine Entscheidung beeinflussen?

Antwort

2

Sehen Sie diese related SO answer auf, wie Windows-Taskleiste/OS X-Menüleiste Funktionalität in WxPython zu erreichen.

10

Hier ist ein Beispiel für PyQt. Das funktioniert für mich auf MacOS X; Ich habe es nicht auf anderen Plattformen versucht. Beachten Sie, dass die Klasse QSystemTrayIcon Ausnahmen auslöst, wenn sie kein Symbol hat - ich nahm die RSS feed svg from Wiki commons für meine icon.svg (aber Sie können QIcon ein PNG direkt geben und nicht mit QtSvg herumspielen).

import PyQt4 
from PyQt4 import QtCore, QtGui, QtSvg 

app = QtGui.QApplication([]) 

i = QtGui.QSystemTrayIcon() 

m = QtGui.QMenu() 
def quitCB(): 
QtGui.QApplication.quit() 
def aboutToShowCB(): 
print 'about to show' 
m.addAction('Quit', quitCB) 
QtCore.QObject.connect(m, QtCore.SIGNAL('aboutToShow()'), aboutToShowCB) 
i.setContextMenu(m) 

svg = QtSvg.QSvgRenderer('icon.svg') 
if not svg.isValid(): 
raise RuntimeError('bad SVG') 
pm = QtGui.QPixmap(16, 16) 
painter = QtGui.QPainter(pm) 
svg.render(painter) 
icon = QtGui.QIcon(pm) 
i.setIcon(icon) 
i.show() 

app.exec_() 

del painter, pm, svg # avoid the paint device getting 
del i, icon   # deleted before the painter 
del app