Text in einem Canvas Rechteck

Fragen zu Tkinter.
Antworten
Dorfl
User
Beiträge: 17
Registriert: Sonntag 23. November 2008, 17:18

Guten Tag,
kurz und schmerzlos:
ich muss ein Buchstaben auf einem Rechteck erscheinen lassen , den ich aich später "löschen" daher auf ein anderes Rechteckt erscheinen lassen kann erstellen...

kann ich das erreichen in dem hier hier

Code: Alles auswählen

self.G1 = Canvas.Rectangle(self.grundflaeche, (varx["G"],vary[1]+1) , (varx["H"]-1,vary[2]) , fill = "white")
einfach etwas eintrage?
und wenn ja, kennt ihr ein gutes deutschsprachiges Tutorial ?

danke im vorraus :wink:
BlackJack

Was ist `Canvas.Rectangle`? Meinst Du vielleicht die `create_rectangle()`-Methode auf `Canvas`-Objekten? Die würde man dann aber auch nicht auf `Canvas` sondern auf dem konkreten Exemplar davon aufrufen.

Du wirst zwei Objekte erzeugen müssen, das Rechteck und den Buchstaben als Textobjekt. Die IDs, die bei den `create_*`-Methoden zurückgegeben werden musst Du dann aufheben, um die dazugehörigen Objekte auf dem `Canvas` später zum Beispiel mit `itemconfig()` manipulieren zu können.

Das ganze sollte man auf Python-Seite am besten wieder in (Python-)Objekten kapseln, um verständlicheren Quelltext zu bekommen.
Dorfl
User
Beiträge: 17
Registriert: Sonntag 23. November 2008, 17:18

also ´Canvas.Rectangle`gibts wirklich ^^
damit wird ein rechteck erstellt , zuerst kommt (glaube heißt) parent,dann obere linke ecke und untere linke ecke und dann beliebige dinge...
öhm joa..
will grad halt nen brettspiel nachprogrammieren und inner schule hatten wir mal nen programm von unserem lehrer zuende geschrieben wo halt 8"damen"spielsteine so gesetzt worden sind das sie weder diagonal noch horizontal oder vertikal auf der selben linie wie ein anderer spiel stein sind...
aber bin morgen erst inner schule wo ich mir das abgucken könnte wie man halt , z.B. ein D ( für dame) auf ein feld erzeugen könnte .. daher dachte ich man könnte statt nur ´fill´auch ein anderes argument noch reinschreiben , das buchstaben bzw. symbole anzeigen lässt :?
BlackJack

Welche Python-Version ist denn das? Bei meinem `Tkinter` ist `Canvas` eine Klasse und da gibt's auch keine "inneren" Klassen. Sicher dass Du nicht die Methode `Canvas.create_rectangle()` meinst?
Dorfl
User
Beiträge: 17
Registriert: Sonntag 23. November 2008, 17:18

naja.. hier mal meinen code für das "Brett" (ENTSCHULDIGUNG vorher schon mal für meinen programmierstil... und das ich warscheinlich sehr primitiv geschrieben hab.. aber ich hoffe es so , meine späteren arbeiten an diesem spiel zu erleichten :? )

http://paste.pocoo.org/show/118907/

so ... das ist der Code.. ist erstma nur relativ simpel.. und z.b. in den weißenfeldern am rand sollen die buchstaben A-N bzw. 1-15 hin als koordinaten system wie beim schach.. und dann halt die spiel Figuren als ANfangsbuchstaben wie Zwerg = Z , Troll = T ,
man merkt vllt schon , das ich das im Buch von Terry Pratchett erwähnte viel Klonk/Thud nachprogrammieren will ^^
BlackJack

@Dorfl: Sofort aufhören und erst einmal mit den Grundlagen beschäftigen. Es gibt so etwas wie *Schleifen*. Da braucht man nicht zig-mal den gleichen Quelltext per Kopieren und Einfügen "schreiben".

Und lass die Finger vom `Canvas`-Modul! Gleich am Anfang von dem Modul steht folgender Kommentar:

Code: Alles auswählen

# NOTE: This module was an experiment and is now obsolete.
# It's best to use the Tkinter.Canvas class directly.
Zu Deutsch, das Modul war ein Experiment und soll nicht mehr verwendet werden.
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

Ja, dein Code ist grausam.
Sieh dir doch das folgende Beispiel mal an und experimentiere damit herum. Wenn du dir dafür genügend Zeit nimmst, kannst du darauf aufbauen.

Code: Alles auswählen

import Tkinter as tk

fenster = tk.Tk()
brett = tk.Canvas(fenster, width=640, height=400)
brett.pack()
links, oben = 20, 20
breite = 40
y = oben
for felderzahl in xrange(5,16,2):
    einrueckung = links + 7*breite - felderzahl/2*breite
    farbe = "gray"
    for x in xrange(einrueckung, einrueckung+felderzahl*breite, breite):
        brett.create_rectangle(x,y,x+breite,y+breite,fill=farbe)
        farbe = "gray" if farbe == "white" else "white"
    y += breite
fenster.mainloop()
BlackJack

Wobei ich bei so einem Brettspiel nicht mit der Grafik anfangen würde, sondern erst einmal mit dem Spiel selbst.
Dorfl
User
Beiträge: 17
Registriert: Sonntag 23. November 2008, 17:18

@ numerix
danke, ich schätze mit dem wirds wirklich kürzer :)

@ blackjack
warscheinlich wirklich besser, aber ich wollte mit dem scheinbar leichtesten anfangen :roll: :wink:
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

Dorfl hat geschrieben:@ blackjack
warscheinlich wirklich besser, aber ich wollte mit dem scheinbar leichtesten anfangen :roll: :wink:
Nicht nur "wahrscheinlich": Es IST besser und eigentlich der einzig sinnvolle Weg. Deine Vorgehensweise - abgesehen vom konkret-grausamen Code - ist ein häufiger Anfängerfehler: Erst wird die Optik gemacht (irgendwie, Hauptsache am Ende sieht das Ergebnis - nicht der Quelltext! - einigermaßen aus) und danach dann die ganze Logik. Das sind dann leider meistens auch die Programme, die über die Optik nicht hinauskommen.

Das richtige Vorgehen wäre in der Tat: Erst einmal überlegen und Datenstrukturen etc. entwerfen, mit denen du die Spiellogik umsetzen kannst. Wenn du dabei merkst, dass du das nicht auf die Reihe bekommst, kannst du dir das Spielbrett auch sparen und dich nach einem leichteren Projekt umsehen. :wink:
Dorfl
User
Beiträge: 17
Registriert: Sonntag 23. November 2008, 17:18

^^ das warscheinlich war nur darauf bezogen das ich so meine die weitere vorgehensweise (also wie ich mir gedacht hätte alles zu verknüpfen usw. ) umändern muss :wink:

jetzt hab ich aber auch noch ne möglichkeit gefunden des feld zu erstellen ohne canvas , wie es mir geraten wurde^^
mit frames und labels ^^

und das mit der optik und der logik , das soll ja erst die erste version werden ^^ sehr simpel usw. und dann nach und nach ausbessern ( code schleifen, grafik zu verbessern und irgentwann hatte ich mir vorgenommen das man es auch über ein netzwerk spielen und (das wird wohl nur nen wunschtraum bleiben... ne KI einzubauen , das man es auch solo spielen kann :S :wink: )

aber erstma nochma danke an euch beiden :)
BlackJack

Wenn Du nicht mit einer soliden, von der GUI abgekoppelten Basis anfängst, dann wird das mit dem Nachbessern höchstwahrscheinlich nur komplizierter als es sein müsste. Das sollte man sauber trennen, auch bei einer ersten Version. Denn wenn man von der GUI anfängt und GUI und Logik vermischt, kann man sich Netzwerk und KI eigentlich schon abschminken, ohne dass man das von grundauf von der anderen Seite her noch einmal neu schreibt.

Denn sowohl Netzwerk als auch KI haben gemeinsam, dass man das Spiel auch ohne die GUI betreiben können muss. Beim Netzwerk ist die GUI auf einem ganz anderen Rechner als das Spiel selbst, und die KI sollte ja keine Bildschirmphotos analysieren und Tastatur- und Maus-Ereignisse synthetisch erzeugen müssen um mit dem Spiel zu interagieren.

Ich würde mit dem Spiel selbst, den Datenstrukturen um den Spielzustand zu modellieren, anfangen. Gesteuert mit einer ganz einfachen Schnittstelle über's Terminal. Das Spielfeld als zweidimensionales Zeichenfeld mit 'z's für die Zwerge und 'T's für die Trolle. Buchstaben an den Spalten und Zahlen an den Zeilen, so dass man Felder mit Angaben wie 'A17' beschreiben kann. So etwas in dieser Richtung:

Code: Alles auswählen

   ABCDEFGHIJKLMNO
        -----
 1     /zz zz\
 2    /z     z\
 3   /z       z\
 4  /z         z\
 5 /z           z\
 6|z             z|
 7|z     TTT     z|
 8|      TXT      |
 9|z     TTT     z|
10|z             z|
11 \z           z/
12  \z         z/
13   \z       z/
14    \z     z/
15     \zz zz/
        -----
Zwerge sind am Zug.
Zug eingeben: 
Vielleicht im nächsten Schritt mit dem `curses`-Modul, damit man ein wenig Farbe in die Sache bringen kann, weil die Felder mit einem Schachbrettmuster besser zu erkennen sind.
Antworten