Hässlicher Programmaufbau -- Trick gesucht.

Fragen zu Tkinter.
Antworten
Üpsilon
User
Beiträge: 222
Registriert: Samstag 15. September 2012, 19:23

N'abend. Inner Schule ham wir die Aufgabe bekommen, mit Tkinter+Canvas ein Spiel zu programmieren, wo sich ein Ball über den Bildschirm bewegt und der Spieler einen Punkt kriegt, wenn er den anklickt. So weit, so simpel.

Ahaber (und jetzt kommt der Haken): Weil sich der Ball ständig bewegen soll, kann ich ja nich einfach fenster.mainloop() aufrufen. Da haben ich (und vermutl meine Mitschüler auch) uns was gebastelt a la
while True: fenster.update() und in der Schleife dann auch den Bewegungscode.

Da man aber auch Punkte kriegen will, wenn man auf den Ball klickt, brauchen wir einen Event-Handler, der die Punktzahl modifiziert. Den hab ich mit .bind ans Canvas rangetackert. Ist aber eine Funktion, die eine globale Variable modifiziert. Böse, ich weiß! Aber darum solls hier nich gehen.

Ich hab also
einerseits das Bewegen des Balles in nem linearen Programmablauf,
sowie das Punktezählen in nem Event-Handler.
Das gefällt mir nicht. Ich will
entweder den Ball auch in nem Event-Handler bewegen. Der müsste dann ja mit nem Timer-Event aufgerufen werden. Gibts sowas in Tk? Hab im Internetz nix gefunden.
Oder aber, ich zähle die Punkte auch in der Schleife. Wäre ich mit Pygame unterwegs, würde ich in pygame.event.get() nach Klick-Events schauen. Gibts sowas wie pygame.event.get() bei Tk? Hab auch dafür im Internet nix gefunden.

Naja, Tk und v.a. dessen Canvas sind sowieso n bissl komisch. Wundert mich ehrlich gesagt, dass der #! überhaupt in der Stdlib gelandet sind.

In der Hoffnung, sich verständlich ausgedrückt zu haben,
verbleibt mit freundlichen Grüßen,
Y.
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Schau dir mal die after-Methode an. Da kannst du einen Zeitintervall und eine Callback-Funktion übergeben. Das Forum ist voll zu dem Thema. Das ist zwar in diesem Fall nicht unbedingt die schönste Methode, aber die sollte hier ausreichen.
Üpsilon hat geschrieben:Naja, Tk und v.a. dessen Canvas sind sowieso n bissl komisch. Wundert mich ehrlich gesagt, dass der #! überhaupt in der Stdlib gelandet sind.
Tk ist nicht komisch, na gut ein wenig schräg schon, aber GUIs sind eben anderen Konzepte als lineare Programme. Das braucht eben etwas Umdenken.
Das Leben ist wie ein Tennisball.
Üpsilon
User
Beiträge: 222
Registriert: Samstag 15. September 2012, 19:23

Ok, danke.

Mit "komisch" meinte ich ehrlich gesagt sowas wie

Code: Alles auswählen

fenster.geometry("400x300") # statt fenster.size =400,300

Code: Alles auswählen

label.config(text="Baum") # statt label.text = "Baum"

Code: Alles auswählen

label.cget("text") # statt label.text

Code: Alles auswählen

canvas.create_oval(...) # -> gibt einen int-Wert? WTF
Außerdem war für mich etwas ... überraschend, dass ein Canvas mehr so ne Art Vektorgrafik ist. Hab dafür ne Weile gebraucht, um das zu raffen. Wobei ich ja auch von pygame vorgeschädigt bin.
PS: Die angebotene Summe ist beachtlich.
BlackJack

@Üpsilon: Tk ist vielleicht ”komisch” weil es vergleichsweise uralt ist. Das ist aber zu der Zeit als es in die Standardbibliothek aufgenommen wurde eine sehr naheliegende Wahl gewesen: Es war und ist ein sehr portables GUI-Rahmenwerk, vergleichsweise Simpel aufgebaut und klein, darauf ausgelegt in eine andere Sprache eingebettet zu werden (original in TCL), und es gibt auch Anbindungen in anderen dynamisch typisierten Programmiersprachen (Perl und Ruby beispielsweise).

`Canvas` ist in sofern ungewöhnlich als das es Vektorgraphik ist und schon zu einer Zeit wo die meisten anderen GUI-Rahmenwerke die heute so üblich sind nur pixelbasierte Zeichenflächen angeboten haben. Und das beschert einem dann Möglichkeiten die für diese Aufgabe wie geschaffen sind. Zum Beispiel das man die Position von Grafikelementen nachträglich neu setzen kann ohne das man selber alles neuzeichnen muss, oder auch das man Grafikelemente direkt anklickbar machen kann. Ich hoffe Du nutzt das beides auch aus und machst das nicht selbst‽

Edit: `config()` verwende ich eigentlich nur wenn ich mehrere Sachen auf einmal ändern möchte und `cget()` habe ich noch nie verwendet. Wenn ich nur *eine* Option setzen oder abfragen möchte dann mache ich das per Indexzugriff: ``label['text'] = 'Spam'`` und ``text = label['text']``.
Üpsilon
User
Beiträge: 222
Registriert: Samstag 15. September 2012, 19:23

Zum Beispiel das man die Position von Grafikelementen nachträglich neu setzen kann ohne das man selber alles neuzeichnen muss, oder auch das man Grafikelemente direkt anklickbar machen kann. Ich hoffe Du nutzt das beides auch aus und machst das nicht selbst‽
:oops: :oops: :oops: xD ich hab mir die Koordinaten in Variablen gespeichert und delete den Ball jedes Mal vom Bildschirm, dann Koords ändern und neu zeichnen...
Und das direkte Anklicken... da hab ich mir auch was mit den Koordinaten gebastelt.
Edit: `config()` verwende ich eigentlich nur wenn ich mehrere Sachen auf einmal ändern möchte und `cget()` habe ich noch nie verwendet. Wenn ich nur *eine* Option setzen oder abfragen möchte dann mache ich das per Indexzugriff: ``label['text'] = 'Spam'`` und ``text = label['text']``.
:shock: :shock: :shock: DAS GEHT?!!

Wobei ich sagen muss: Programmieren mit Python+Tk macht voll Spaß, solange es funktioniert. Wenn es aber mal nicht funktioniert, ist die Fehlersuche knifflig.
PS: Die angebotene Summe ist beachtlich.
Antworten