Gtk Kreise zeichnen

Fragen zu Tkinter.
Antworten
iceman21
User
Beiträge: 41
Registriert: Sonntag 25. März 2007, 20:45
Kontaktdaten:

Hallo

Ich bin noch im Anfangsstadium und komme mit den Hilfen nicht weiter.
Kann mir jemand sagen, wie man einen einfachen Kreis der Farbe f in einer bestimmten Größe macht an der Stelle x, y? (Oder auch Quadrat)

Danke
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Ich habe dafür GNOME-Canvas benutzt, kannst du das nutzen? Oder muss es etwas anderes sein, weil du keine GNOME-Dependencies brauchen kannst?
iceman21
User
Beiträge: 41
Registriert: Sonntag 25. März 2007, 20:45
Kontaktdaten:

das sagt mir jetzt nichts .. aber ich würde lieber etwas nutzen was man auch leicht auf Windows übertragen kann. Oder geht das damit auch?

Ansonsten könnte man auch Bilder nehmen denke ich aber das ist nicht ganz Sinn der Sache ...

Das ganze wird ein Spielfeld. Mein Programm ist eine KI dazu. ich möchte dieses Tool anschließend nutzen um meine Berechnungen zu visualisieren.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

iceman21 hat geschrieben:das sagt mir jetzt nichts .. aber ich würde lieber etwas nutzen was man auch leicht auf Windows übertragen kann. Oder geht das damit auch?
Soweit ich weiß nicht, GooCanvas läuft auch auf Windows aber die Python-Bindings wurden bischer nicht für Windows kompiliert.

Ansonsten lässt sich gegebenfalls direkt etwas über Cairo zeichnen, aber da bin ich überfragt wie das gehen soll.

Wie gut dass ich solche Probleme nicht mehr habe :)
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

iceman21 hat geschrieben:Hallo

Ich bin noch im Anfangsstadium und komme mit den Hilfen nicht weiter.
Kann mir jemand sagen, wie man einen einfachen Kreis der Farbe f in einer bestimmten Größe macht an der Stelle x, y? (Oder auch Quadrat)

Danke
Falls es nicht unbedingt GTK sein muss: Mit Tkinter ist so etwas sehr einfach möglich und läuft unter Windows und Linux gleichermaßen ohne Probleme.
iceman21
User
Beiträge: 41
Registriert: Sonntag 25. März 2007, 20:45
Kontaktdaten:

ja? wie geht das denn da? und ist das leicht zu benutzen? habe mich jetzt gerade an gtk angearbeitet
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Erster Treffer wenn ich nach "Cairo draw on window" suche sieht schon sehr interessant aus.
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

iceman21 hat geschrieben:ja? wie geht das denn da? und ist das leicht zu benutzen? habe mich jetzt gerade an gtk angearbeitet

Code: Alles auswählen

import Tkinter as tk

root = tk.Tk()
canvas = tk.Canvas(root)
canvas.pack()
canvas.create_oval(10,10,80,80, fill="red")
root.mainloop()
Das ist ein vollständiges, lauffähiges Programm, das einen roten Kreis zeichnet.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Da würde ich ja schon lieber Qt nehmen, das hat auch ein Canvas-Widget mit dabei ;)
iceman21
User
Beiträge: 41
Registriert: Sonntag 25. März 2007, 20:45
Kontaktdaten:

ok Nach ein paar Spielereien mit dem netten Tool was ich aus der Beispieluhr gebaut habe kommt jetzt ein Fehler wenn ich einen 2. Kreis zeichnen möchte weil der da "nicht mehr rein passt"

Code: Alles auswählen

GtkWarning: Attempting to add a widget with type GtkDrawingArea to a GtkWindow, but as a GtkBin subclass a GtkWindow can only contain one widget at a time; it already contains a widget of type GtkDrawingArea
  window.add(circle2)
Wie kann man das umgehen? Vielleicht mit extra frames? ps ich brauche um die 550 Kreise (23*23 Spielbrett)

Bei den ganzen Vorschlägen kann man sich ja gar nicht entscheiden ... Also ich brauche ein Spielbrett mit 23*23 Kreisen die ich einzeln einfärben möchte. Zudem muss ich noch ein paar Linien zeichnen, die Punkte Verbinden und Eine Zahl in die Punkte schreiben. Womit geht das am einfachsten?
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

iceman21 hat geschrieben:Bei den ganzen Vorschlägen kann man sich ja gar nicht entscheiden ... Also ich brauche ein Spielbrett mit 23*23 Kreisen die ich einzeln einfärben möchte. Zudem muss ich noch ein paar Linien zeichnen, die Punkte Verbinden und Eine Zahl in die Punkte schreiben. Womit geht das am einfachsten?
Mit Tkinter sieht das so aus:

Code: Alles auswählen

import Tkinter as tk
from random import randrange

root = tk.Tk()
d = 20
canvas = tk.Canvas(root, width=d*25, height=d*25)
for y in xrange(23):
    for x in xrange(23):
        color = "#%02x%02x%02x" %(randrange(256),randrange(256),randrange(256))
        canvas.create_oval(d+x*d,d+y*d,2*d+x*d,2*d+y*d, fill=color)
canvas.pack()
root.mainloop()
Benutzeravatar
Trundle
User
Beiträge: 591
Registriert: Dienstag 3. Juli 2007, 16:45

Du versuchst mehr als ein Widget in ein Fenster zu packen, was nicht geht. Dafür brauchst du Container.

Und mit Cairo könnte man das zeichnen. Da kann man dann auch einfach eine Transformationsmatrix setzen, so dass man schön unabhängig von der Widgetgröße das Spielfeld zeichnen kann, ohne da groß rumrechnen zu müssen. Hier ist ein Beispiel-Widget, das Cairo verwendet und ich mal für einen anderen Thread gebaut habe.
"Der Dumme erwartet viel. Der Denkende sagt wenig." ("Herr Keuner" -- Bertolt Brecht)
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Was soll das denn für ein Spiel werden? Denn man könnte unter Unmständen diese Cairo-Widgets in ein gtk.Table setzen und dadurch hast du sie automatisch hübsch plaziert. Vorrausgesetzt du musst nicht Linien quer über alle Kreise zeichnen oder so (deswegen frage ich was das für ein Spiel werden soll).
lunar

Leonidas hat geschrieben:Da würde ich ja schon lieber Qt nehmen, das hat auch ein Canvas-Widget mit dabei ;)
Eigentlich nicht. Es gibt nur das QGraphicsView-Framework, was für einen einfachen Kreis allerdings viel zu viel Aufwand ist. Den kann man auch direkt auf das Widget zeichnen. Für ein Spielbrett aber wäre das QGraphicsView-Zeug ideal. Bei Interesse kann ich dafür gerne auch ein Beispiel erstellen.
iceman21
User
Beiträge: 41
Registriert: Sonntag 25. März 2007, 20:45
Kontaktdaten:

so ich habe mich jetzt für Tkinter entschieden. Damit bin ich recht schnell weiter gekommen. hier mein bisheriger Code:
http://paste.pocoo.org/show/101925/

Wenn ihr mir jetzt nur noch sagen könntet wie man eine Linie malt, wäre das super. Und noch wie man an eine bestimmte Position x,y etwas schreibt.

Bin eigentlich schon fast fertig. Muss es nur noch einbinden also eine Klasse dafür schreiben.

Edit (Leonidas): Thread verschoben.
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

iceman21 hat geschrieben:Wenn ihr mir jetzt nur noch sagen könntet wie man eine Linie malt, wäre das super. Und noch wie man an eine bestimmte Position x,y etwas schreibt.
Streng dich mal an: http://effbot.org/tkinterbook/canvas.htm
iceman21
User
Beiträge: 41
Registriert: Sonntag 25. März 2007, 20:45
Kontaktdaten:

OK habe das jetzt zwar alles geschafft aber leider kommt schon das nächste problem. Der mainloop von Tkinter verhindert es, dass meine KI weiterrechnet nachdem es die Oberfläche anzeigt. Das heißt ich muss es entweder als Extra Programm laufen lassen oder ich nehme eine andere GUI. Geht das mit andern GUI's überhaupt? Also ein Fenster ohne Loop, sodass der Script danach weiter ausgeführt wird?
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

iceman21 hat geschrieben:OK habe das jetzt zwar alles geschafft aber leider kommt schon das nächste problem. Der mainloop von Tkinter verhindert es, dass meine KI weiterrechnet nachdem es die Oberfläche anzeigt. Das heißt ich muss es entweder als Extra Programm laufen lassen oder ich nehme eine andere GUI. Geht das mit andern GUI's überhaupt? Also ein Fenster ohne Loop, sodass der Script danach weiter ausgeführt wird?
Du hast eine Grundidee von GUIs noch nicht verstanden. Der Weg wäre dieser: GUI aufsetzen bis mainloop() - Aufbau steht. Dann z.B. einen Button auf der GUI haben, bei dessen Klick die Berechnung durchgeführt wird.
Antworten