2010-05-03 5 views
7

Ich möchte eine GUI erstellen, bei der jedes einzelne Pixel unter meiner Kontrolle steht (d. H. Nicht die Standard-Widgets verwenden, die etwas wie GTK + bietet). Renoise ist ein gutes Beispiel für das, was ich produzieren möchte.Wie würden Sie unter Linux eine "pixelperfekte" GUI erstellen?

Geht man auf Xlib- oder XCB-Ebene den besten Weg, oder ist es möglich, dies mit höheren Frameworks wie GTK + (vielleicht sogar PyGTK) zu erreichen? Soll ich Kairo nach der Zeichnung sehen?

Ich würde gerne in Python oder Ruby arbeiten, wenn möglich, aber C ist auch in Ordnung.

Antwort

7

Mit Clutter Toolkit (oder einem anderen Canvas-Widget/Toolkit) können Sie eine solche Schnittstelle erstellen. Ich würde nicht empfehlen, auf die Ebene von Xlib/XCB oder DrawingArea zu gehen, da dies die Implementierung vieler generischer Funktionen erfordern würde, die bereits in Canvases vorhanden sind.

+0

Wow! Clutter sieht gut aus! Danke Dmitry! Gibt es einen Grund, warum ich es nicht benutzen sollte? – splicer

3

Sie werden wahrscheinlich so etwas wie pygame dann wollen.

1

GTK und PyGTK sind wahrscheinlich die falschen Tools zu verwenden. Es ist nicht unmöglich, weil Sie Ihre gesamte Anwendung eine große gtk.DrawingArea haben könnten (ein Beispiel dafür, wo es eigentlich Sinn macht ist Gargoyle), aber für jede Art von komplizierten GUI würden Sie verrückt werden.

1

In einfachen Worten, Sie brauchen etwas, das Ihnen ein begrenzendes Rechteck und freie Herrschaft gibt, um darin zu zeichnen, was Sie wollen. Solche Objekte werden üblicherweise als "Leinwand" bezeichnet. Ich habe das schon früher (in Ruby) mit der FXCanvas-Klasse gemacht, die über die Fox toolkit verfügbar ist, aber es gibt auch andere (wxWidgets zum Beispiel, aber ich habe keine persönlichen Erfahrungen mit diesem Toolkit).

Seien Sie gewarnt, obwohl. Low-Level-Schnittstellen wie diese bieten viel Flexibilität, erfordern aber auch viel mehr Arbeit von Ihrer Seite.

5

In X gibt es ein Problem mit diesem Ansatz, das Sie möglicherweise nicht berücksichtigt haben. Die Schriftgröße wird in Punkten gemessen (ein Punkt ist 1/72 Zoll) und variiert daher in Pixelgröße mit Auflösung und Monitorgröße. Die Länge der Textstrings variiert auch in Abhängigkeit von der Sprache, so dass es nicht wirklich möglich ist zu bestimmen, wie groß Schaltflächen und Ähnliches sein müssen. Die üblichen GUI-Toolkits für X wurden in diesem Sinne entwickelt. Abgesehen davon wäre es einfach, eine eigene Theme-Engine für GTK zu schreiben, die alle Widgets exakt nach Ihren Wünschen zeichnet (mit Cairo [1] oder GDK [2]) und Ihre Anwendung immer dieses Theme verwendet. Vielleicht wäre es auch möglich, dass Ihre Anwendung die Standardschriftgröße (in Punkten) basierend auf der DPI so einstellt, dass sie immer dieselbe Größe in Pixeln erhält (und Ihre Anwendung natürlich nicht übersetzbar macht).

Es gibt mindestens ein paar GUIs, die diesen pixelperfekten Ansatz basierend auf SDL [3] verwenden, zum Beispiel AGAR [4], PicoGUI [5] und Guichan [6]. Die meisten davon sind in C++ und einige in C geschrieben und soweit ich weiß, hat keiner von ihnen Bindings für Python oder Ruby. Dann können Sie mit SDL nur ein Top-Level-Fenster haben, was bedeutet, dass Ihre Anwendung (oder das von Ihnen verwendete GUI-Toolkit) ein eigenes Fenster verwalten muss, das für verschiedene Dialoge und dergleichen verwaltet. Aber ich nehme an, das war es, was Sie eigentlich wollten.

[1] cairographics.org/
[2] library.gnome.org/devel/gdk/unstable/index.html
[3] www.libsdl.org/
[4] libagar.org/
[5] picogui.org/
[6] guichan.sourceforge.net/wiki/index.php/Main_Page

+1

Die richtige Antwort! – Joshua

Verwandte Themen