Einfache Symbole in Python printen

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
meego
User
Beiträge: 380
Registriert: Montag 4. März 2013, 14:36

Gibt es eine ähnliche Library in Python?:
http://docs.racket-lang.org/quick/index.html
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

Welche Symbole brauchst du denn? Unicode gibt ja schon eine ganze Menge her.
BlackJack

Die Frage nach ”Symbolen” ist eventuell etwas irreführend weil bei der verlinkten Seite Bilder erzeugt und in der IDE angezeigt werden. Wenn man das in Python machen möchte, dann funktioniert das nicht in der normalen Textkonsole, denn die stellt keine Bilder dar. In den grafischen Versionen von IPython könnte man so etwas vielleicht machen, oder man schreibt sich eine eigene GUI-Shell die Bilder darstellt.

Und dann braucht man natürlich noch etwas nach dem der OP gefragt hat und wo ein besserer Link wohl dieser wäre: Pict: Functional Pictures.

Mir ist so ein Modul/Package für Python nicht bekannt.
meego
User
Beiträge: 380
Registriert: Montag 4. März 2013, 14:36

Gemeint sind Bildsymbole (Vierecker, Kreise, etc.)

Racket bringt sowohl das GUI-Framework als auch diese Slideshow Bibliothek von Haus aus mit.

Also über TkInter? Ziel ist übrigens nicht die Bildsymbole in der REPL zu haben (obwohl das natürlich die Entwicklung vereinfacht).
BlackJack

@meego: So eine Bibliothek kann man sich mit/für Tkinter sicherlich relativ schnell selber schreiben. Dann vielleicht mit einer ”render”-Methode auf dem/den `Pict`-Objekten die `Canvas`-Exemplare erzeugt auf denen dann das Bild gezeichnet ist.
meego
User
Beiträge: 380
Registriert: Montag 4. März 2013, 14:36

Naja, ich bin immer noch Anfänger. Tkinter ist also die einfachste Python-GUI?
BlackJack

@meego: Ich würde sagen ja, auch mit den Nachteilen die das hat — komplexere Sachen die in anderen GUI-Rahmenwerken zum Lieferumfang gehören muss man sich in Tkinter selber basteln. Dafür gehört es zur Standardbibliothek. Hat halt alles so seine Vor- und Nachteile. :-)
meego
User
Beiträge: 380
Registriert: Montag 4. März 2013, 14:36

Im kürzlichen Mooc wurde gesagt, Tkinter und wxPython (? - wenn ich mich richtig erinnere..) seien am einfachsten für den Einstieg, aber ich glaube der Lehrer kannte nur ersteres aus der Praxis.
Tkinter kommt bei Linux übrigens, so viel ich mich entsinne, nicht mit.
BlackJack

@meego: Bei `Tkinter` kann ich das ja noch glauben aber wxPython schleppt, auch wenn sich das gebessert hat, doch eine Menge Altlasten wie diese IDs mit sich herum die eigentlich Objektidentitäten sein sollten. Früher musste man die wirklich so ziemlich überall angeben, mittlerweise geschieht das oft automatisch im Hintergrund, aber ganz sind die noch nicht aus der API verschwunden.

`Tkinter` ist unter den meisten Linux-Distributionen in einem eigenen Paket von der jeweiligen Paketverwaltung der Distribution damit man Python auch auf Servern installieren kann die keine grafische Oberfläche haben ohne das man sich durch Python dann die X-Bibliotheken und Tk auf einen Server holt wo man sie nicht haben/brauchen kann. Aber installierbar sollte das bei jedem Linux sein. Wenn IDLE installiert ist, dann muss auch `Tkinter` installiert worden sein.
Benutzeravatar
MagBen
User
Beiträge: 799
Registriert: Freitag 6. Juni 2014, 05:56
Wohnort: Bremen
Kontaktdaten:

@meego: Kannst Du ein Beispiel dazu geben, wozu Du Text und Grafikausgabe gemischt brauchst?
Eventuell wäre ipython notebook was für Dich: http://ipython.org/notebook.html
ipython notebook ist eine Python-Shell, die auch Bilder, HTML und LaTeX anzeigen und abspeichern kann.
a fool with a tool is still a fool, www.magben.de, YouTube
meego
User
Beiträge: 380
Registriert: Montag 4. März 2013, 14:36

Ich kann mich einfach daran erinnern:
https://askubuntu.com/questions/513981/ ... ot-to-work

Bezüglich Beispiel:
Ich brauche nur die Grafikanzeige und die dann auf einem Raspi-Touchscreen. Im Sinne von einem "Getränkeautomaten". Wenn man auf das Bildsymbol tickt soll sich schlussendlich ein Servo bewegen.
Benutzeravatar
MagBen
User
Beiträge: 799
Registriert: Freitag 6. Juni 2014, 05:56
Wohnort: Bremen
Kontaktdaten:

meego hat geschrieben:Wenn man auf das Bildsymbol tickt soll sich schlussendlich ein Servo bewegen.
Wie wäre es mit einem Button mit Bild?
a fool with a tool is still a fool, www.magben.de, YouTube
BlackJack

@meego: Dann kommst Du vielleicht mit dem was Unicode so bietet aus. Ansonsten musst Du das Bild ja nicht in Deinem Programm erzeugen sondern kannst auch einfach ein Grafikprogramm verwenden und ein Symbol als Bild malen/zeichnen und das wie Magben vorschlägt verwenden. Oder bei Tkinter das `Canvas`-Widget verwenden und darauf ganz normal zeichnen. Deine ursprüngliche Frage war da ein wenig irreführend denn da dachte zumindest ich das Dir diese funktionale API irgendwie wichtig wäre.
meego
User
Beiträge: 380
Registriert: Montag 4. März 2013, 14:36

Ich kenne die Möglichkeiten von Tkinter nicht, es soll eine Art Memory oder Auswahlspiel werden.

Bei Racket ist natürlich toll, dass die das gleich auch noch in der REPL zur Verfügung stellen. Aber ich komme bestimmt auch ohne aus.

Kennt jemand eine Video-Einführung in Tkinter?
Benutzeravatar
peterpy
User
Beiträge: 188
Registriert: Donnerstag 7. März 2013, 11:35

kein Video aber eine gute Einführung (Handbuch)
http://infohost.nmt.edu/tcc/help/pubs/t ... index.html
Gruss
Peter
nezzcarth
User
Beiträge: 1634
Registriert: Samstag 16. April 2011, 12:47

meego hat geschrieben:Ich kann mich einfach daran erinnern:
https://askubuntu.com/questions/513981/ ... ot-to-work
Wobei absolute Aussagen wie "bei Linux", oder "Tkinter is not part of standard python on Linux based OS'es" wie in dem verlinkten Thread schwierig sind, angesichts der Anzahl der Linuxdistributionen. Das einzige, was meiner Ansicht nach relevant ist, ist doch dass tcl von tk benötigt wird, und tk von tkinter, sowie python ebenfalls von tkinter und dass all diese Dinge auf den gängigen Distributionen entweder schon vorhanden sind, oder per Paketmananger installiert werden können.

(Und, um dann noch mal besserwisserisch den schwarzen Schwan zu präsentieren: Bei Archlinux ist tkinter im standard python Paket enthalten, funktioniert aber nur, wenn tk als optionale Abhängigkeit auch installiert ist.)
meego
User
Beiträge: 380
Registriert: Montag 4. März 2013, 14:36

Ganz simpel sieht es dann doch nicht aus:

Code: Alles auswählen

#!/usr/bin/env python      1
import Tkinter as tk       2

class Application(tk.Frame):              3
    def __init__(self, master=None):
        tk.Frame.__init__(self, master)   4
        self.grid()                       5
        self.createWidgets()

    def createWidgets(self):
        self.quitButton = tk.Button(self, text='Quit',
            command=self.quit)            6
        self.quitButton.grid()            7

app = Application()                       8
app.master.title('Sample application')    9
app.mainloop()                            10
BlackJack

@meego: Was sollen die Zahlen an den Zeilenenden?

Ein Widget sollte sich nicht selbst „layouten“. Das macht keines der vorhandenen Tk-Widgets weil man damit dem Aufrufer/Ersteller die Möglichkeit nimmt das Wigdet so in den Rest der GUI einzubauen wie er möchte.

Die Namensschreibweise hält sich nicht an den Style Guide for Python Code und die `createWidgets()`-Methode ist zudem noch überflüssig. Die wird nur von der `__init__()` aufgerufen und auch nur einmal, also kann das auch gleich in die `__init__()`.

Das `Button`-Objekt wird nicht mehr benötigt, sollte also auch nicht an das Objekt gebunden werden.

``app.master.title`` geht für meinen Geschmack zu ”magisch” davon aus das man damit an das implizit erzeugte `Tk`-Objekt kommt.

Das würde eher so aussehen, wobei hier die Klasse natürlich auch noch überflüssig ist solange da nicht irgendein Zustand dazu kommt der eine Klasse tatsächlich rechtfertigt:

Code: Alles auswählen

#!/usr/bin/env python
import Tkinter as tk


class ApplicationUI(tk.Frame):
    
    def __init__(self, master):
        tk.Frame.__init__(self, master)
        tk.Button(self, text='Quit', command=self.quit).pack()


def main():
    root = tk.Tk()
    root.title('Sample application')
    application_ui = ApplicationUI(root)
    application_ui.pack()
    root.mainloop()


if __name__ == '__main__':
    main()
meego
User
Beiträge: 380
Registriert: Montag 4. März 2013, 14:36

@blackjack: Das ist doch aus dem offiziellen Tutorial kopiert, welches vom user peterpy verlinkt wurde:
http://infohost.nmt.edu/tcc/help/pubs/t ... l-app.html
BlackJack

@meego: Was ist an dem Tutorial ”offiziell”? Der Autor davon hält sich halt nicht an den Style Guide for Python Code. Ich benutze diese Referenz selbst ab und zu als Referenz, aber die ersten Beispielprogramme sind voll für die Tonne. Das zweite Beispiel macht noch mehr Annahmen darüber wie die Widgethierarchie über dem `Frame` aussieht: Es geht fest davon aus das es direkt in einem Fenster steckt und nicht in einem weiteren Container-Widget und das es dort im Grid-Layout an Position (0, 0) steht. Solche Annahmen sollte ein Widget nicht über sich selber treffen! Wenn man dann zum Beispiel ein `LabelFrame` um das Widget setzen möchte oder dem Fenster in Zeile 0 des Grid-Layouts eine Leiste mit Schaltflächen einfügen will, dann muss man den Code von dem Widget anfassen, was nicht nötig sein sollte wenn es nicht in höheren Ebenen rumpfuschen würde die es nichts angehen.

Wenn Du das übrigens nicht ganz simpel findest, dann ist GUI-Programmierung wohl insgesamt nicht ganz simpel, denn mit Qt oder Gtk sieht es sehr ähnlich aus:

Code: Alles auswählen

#!/usr/bin/env python
import sys
from PyQt4.QtGui import QApplication, QMainWindow, QPushButton


class ApplicationUI(QMainWindow):

    def __init__(self):
        QMainWindow.__init__(self)
        self.setWindowTitle('Sample application')
        button = QPushButton('Quit')
        button.clicked.connect(self.close)
        self.setCentralWidget(button)


def main():
    application = QApplication(sys.argv)
    window = ApplicationUI()
    window.show()
    sys.exit(application.exec_())


if __name__ == '__main__':
    main()

Code: Alles auswählen

#!/usr/bin/env python
from gi.repository import Gtk


class MainWindow(Gtk.Window):

    def __init__(self):
        Gtk.Window.__init__(self, title='Sample application')
        layout = Gtk.Box()
        self.add(layout)
        button = Gtk.Button.new_with_label('Quit')
        button.connect('clicked', Gtk.main_quit)
        layout.pack_start(button, True, True, 0)


def main():
    window = MainWindow()
    window.connect('delete-event', Gtk.main_quit)
    window.show_all()
    Gtk.main()


if __name__ == '__main__':
    main()
Auch hier sind jeweils die Klassen noch nicht wirklich sinnvoll, aber für jedes nicht-triviale Programm was dann auch tatsächlich etwas tut, kommt man bei allen drei Rahmenwerken nicht ohne OOP aus.
Antworten