Kleines Game mit Tkinter - Brauche Hilfe

Fragen zu Tkinter.
Saob
User
Beiträge: 23
Registriert: Mittwoch 12. Dezember 2007, 20:11
Kontaktdaten:

Beitragvon Saob » Freitag 18. Januar 2008, 12:22

BlackJack hat geschrieben:Was soll denn der Quatsch in den ersten beiden Kommentarzeilen? Das führt bei Python 2.5 wegen fehlendem Kodierungskommentar erst einmal zu einem `SyntaxError`, dass Programm lässt sich deswegen also so gar nicht starten.

Du weisst, dass "unangenehmer Programmierstil" bedeutet, dass der Quelltext schwerer zu lesen und verstehen ist, als er sein müsste? Darum werden den sich wahrscheinlich nicht so viele durchlesen wollen, also bekommst Du auch weniger Hilfe als bei saubererem Stil und verständlicherem Quelltext.

Gut das gleich relativ weit oben ein verdächtiges ``import thread`` steht. Man darf bei den meisten GUI-Toolkit, so auch bei `Tkinter`, nur von dem Thread auf die GUI zugreifen, in dem auch die `mainloop()` läuft. Sonst gibt's komische Effekte, bis zu "harten" Programmabstürzen.

Schau Dir mal die `after()`-Methode auf Widgets an und verzichte auf Threads.


Die ersten beiden Kommentarzeilen sind halt in einer etwas ungewöhnlichen Sprache. Die hab ich in allen programmen drinne, da die auch alle für die Schule sind, und andere Leute die nicht einfach kopieren und als ihre ausgeben. Die meisten checken halt nicht was da steht und denken das gehört zum Programmcode, dabei steht da mein name drin was ich dem Lehrer dann nachweisen kann. Hat schon 2 mal geholfen :lol:

Die Coding zeile wird bei meinen Klassenkameraden immer automatisch erzeugt, nur bei mir irgendwie nie und da wir Python 2.41 nutzen oder so hat es auch nie was beeinträchtigt und somit hab ich die auch ignoeriert. Aber danke für den hinweis die eine gewisse bedeutung hat, war für mich halt auch "nur ein kommentar" bisher. aber woher nehme ich die nun? :oops:

die "`after()`-Methode" werd ich mir nun mal anschauen

Wenn du ein freies Archivformat wie zip, tar.gz, tar.bz2 oder 7z verwendest, haben vielleicht noch mehr Leute Lust, deinen Code auszuprobieren. rar ist obsolet, da nicht durch Freie Software zu implementieren.

ich nutze WinRAR seit jahren und hat mich nie nen penny gekostet, hab ich immer bei chip.de gesaugt :?:
Benutzeravatar
Rebecca
User
Beiträge: 1662
Registriert: Freitag 3. Februar 2006, 12:28
Wohnort: DN, Heimat: HB
Kontaktdaten:

Beitragvon Rebecca » Freitag 18. Januar 2008, 12:50

Saob hat geschrieben:ich nutze WinRAR seit jahren und hat mich nie nen penny gekostet, hab ich immer bei chip.de gesaugt :?:


mkallas meinte frei wie in Freiheit, nicht frei wie in Freibier (http://de.wikipedia.org/wiki/Freie_Software).

Du solltest immer bedenken, dass nicht alle Leute Windows benutzen. Ich hab auf meiner Linux-Kiste Probleme, das Archiv mit unrar zu entpacken...
Offizielles Python-Tutorial (Deutsche Version)

Urheberrecht, Datenschutz, Informationsfreiheit: Piratenpartei
BlackJack

Beitragvon BlackJack » Freitag 18. Januar 2008, 12:57

Ob die Kommentarzeilen wirklich so nützlich sind… Da man immer damit rechnen muss vom Lehrer Fragen gestellt zu bekommen, würde ich doch als erstes mal alles rauswerfen, was ich nicht erklären kann, wenn ich fremden Quelltext übernehme.

Als Kodierungskommentar musst Du den Kodierungsnamen einsetzen, den Du auch tatsächlich benutzt. Scheint bei Dir 'cp1252', Window's Codepage für Westeuropa, zu sein. Oder Du darfst im Quelltext keine Zeichen ausserhalb des ASCII-Zeichensatzes verwenden. Es ist ja auch nur Dein "Kopierschutz"-Kommentar, der solche Zeichen enthält.

Bei RAR ging es mkallas weniger um kostenlos oder nicht, sondern um das *frei*, sprich es gibt den Quelltext unter einer OpenSource-Lizenz.

Und falls sich die Bedingungen nicht geändert haben, seit ich RAR eingesetzt habe, könnte es sein, dass Du obwohl kostenlos, nach der Probezeit eine illegale Kopie des Programms verwendest. Ich hatte damals jedenfalls den Anstand zu bezahlen, weil es eine bessere alternative zu ZIP, ARC, LHA & Co war und man für DOS prima selbstentpackende Archive mit Installationsprogramm erstellen konnte.
Saob
User
Beiträge: 23
Registriert: Mittwoch 12. Dezember 2007, 20:11
Kontaktdaten:

Beitragvon Saob » Freitag 18. Januar 2008, 13:28

So habe die Kommentarzeilen editiert, die beiden raus und coding zeile rein.
und hier das ganze nun im .zip format:
http://filebeam.com/4353a00cfba9035e68039dde4a4c7490

zu "after()" kann ich allerdings nicht viel finden, hat jemand nen tutorial link oder so? wäre dankbar
Saob
User
Beiträge: 23
Registriert: Mittwoch 12. Dezember 2007, 20:11
Kontaktdaten:

Beitragvon Saob » Sonntag 20. Januar 2008, 20:36

Danke schonmal an BlackJack, bin aber leider nicht viel weiter damit gekommen.
Wie genau löse ich einen Befehl per .after() aus?
Wenn z.B. bei meinem Spiel, man den Button [G] drücken muss, um das Spiel zu beginnen, soll erst nach 30 Sekunden der Spcial Donut erscheinen. Bisher habe ich dafür in dem befehl "time.sleep(30)" verwendet, was aber dazu führte, das das Programm für 30 Sekunden stehen blieb. Das habe ich dann verhindert, in dem ich dies in einen Thread gepackt habe, wo dann der time.sleep(30) befehl extern ablief und somit nicht das Spielgeschehen beeinflusst hat.
Wie mach ich es nun, anstatt wie hier: ?

Code: Alles auswählen

elif event.keysym == "g":
        Field.delete(Info1, Info2, Info3, Info4, Info5, Info6, Info7, Info8, Info9, Info10, Info11, Info12, Info13, Info14, Info15)
        if GameStarted == 0:
            GameStarted=1
            thread.start_new_thread(countdown,(1,))
            new_donut()
            thread.start_new_thread(new_watch,(1,))
            thread.start_new_thread(new_specialdonut,(1,))
            thread.start_new_thread(ghost,(1,))


PS: giebt es eine möglichkeit, die Hintergrundsfarbe eines Bildes transparent zu machen? Z.B. das hier das weiß nicht angezeigt wird, und dort der hintergrund zu sehen ist:
Bild
schlangenbeschwörer
User
Beiträge: 419
Registriert: Sonntag 3. September 2006, 15:11
Wohnort: in den weiten von NRW
Kontaktdaten:

Beitragvon schlangenbeschwörer » Sonntag 20. Januar 2008, 21:28

Hi!
Wenn du in den Weiten des Webs nichts findest, gib doch einfach mal folgendes in die Pythonshell ein:

Code: Alles auswählen

help(tk.Tk().after)


@PS: Mit Python oder allgemein? Allgemein mit einem einfachen Graphikprogramm als .gif, .png oä. abspeichern. Mit Python ähnlich mit der PIL.
Saob
User
Beiträge: 23
Registriert: Mittwoch 12. Dezember 2007, 20:11
Kontaktdaten:

Beitragvon Saob » Sonntag 20. Januar 2008, 21:40

mit Python, und wenn ich den Code in Python Shell eingebe komm nen error

Code: Alles auswählen

IDLE 1.2.1     
>>> help(tk.Tk().after)

Traceback (most recent call last):
  File "<pyshell#0>", line 1, in <module>
    help(tk.Tk().after)
NameError: name 'tk' is not defined
>>>
Benutzeravatar
Leonidas
Administrator
Beiträge: 16023
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Beitragvon Leonidas » Sonntag 20. Januar 2008, 21:42

Du musst Tkinter schon importieren, sonst wird das natürlich nix:

Code: Alles auswählen

import Tkinter as tk


Bist du sicher, dass du nicht erstmal ein Tutorial durchlesen willst?
My god, it's full of CARs! | Leonidasvoice vs Modvoice
Saob
User
Beiträge: 23
Registriert: Mittwoch 12. Dezember 2007, 20:11
Kontaktdaten:

Beitragvon Saob » Sonntag 20. Januar 2008, 21:48

also da kommt raus "after(self, ms, func=None, *args)"
sieht das ganze nun so aus?

Code: Alles auswählen

            MainWindow.after(20000, func=new_watch)
            MainWindow.after(30000, func=new_specialdonut)


weil so passiert nichts
arris
User
Beiträge: 3
Registriert: Samstag 19. Januar 2008, 10:14

Beitragvon arris » Montag 21. Januar 2008, 06:27

Saob hat geschrieben:

Code: Alles auswählen

            MainWindow.after(20000, func=new_watch)
            MainWindow.after(30000, func=new_specialdonut)


Fast richtig. Das "func=" ist zuviel. Die Signatur der Funktion (...ms, func = None...) sagt Dir nur, dass, wenn keine Funktion angegeben wird, der Parameter mit None belegt wird. Hast Du eine Funktion, gib sie einfach an, ohne das "func = "
Saob
User
Beiträge: 23
Registriert: Mittwoch 12. Dezember 2007, 20:11
Kontaktdaten:

Beitragvon Saob » Montag 21. Januar 2008, 20:22

ok funktioniert nun, danke :)
letzte sache, dann wären alle threads raus und somit der Single Player fertig (denke gerade über 2-Spieler modus):
habe einen Countdown, damit das spiel nicht unendlich lang geht, dieser beträgt zum anfang 90 Sekunden. wenn man aber uhren einsammelt kriegt man 10 sekunden drauf. momentan läuft das so in einem thread, wegen dem time.sleep(1)... :

Code: Alles auswählen

def countdown(count):
    global Secondsremaining, GameStarted, Speed
       
    while GameStarted == 1 and Secondsremaining > 0:
        time.sleep(1)
        Secondsremaining=Secondsremaining - 1
        TimeLabel["text"]="Time remaining: \n" + str(Secondsremaining) + " Seconds"       
        if Secondsremaining == 0:           
            game_over()


und die addierung der 10 sekunden:

Code: Alles auswählen

    elif MarioY == WatchY and MarioX == WatchX:
        Score=Score + 500
        Secondsremaining=Secondsremaining + 10
        TotalTime=TotalTime + 10
        WatchCount=WatchCount + 1
        WatchesCountLabel["text"]="x " + str(WatchCount)
        MainWindow.after(20000, new_watch)


ist sehr primitiv mit ner while schleife gelöst, habe aber ja auch erst seit nem halben jahr informatik unterricht. ich nehme aber an, dafür giebt es sowas wie Timer-Objekte, oder?
wenn nicht, wie könnt ich das lösen mit time.sleep(1) weg und thread raus
Saob
User
Beiträge: 23
Registriert: Mittwoch 12. Dezember 2007, 20:11
Kontaktdaten:

Beitragvon Saob » Montag 21. Januar 2008, 21:00

Ok, hab es geschafft dies zu lösen, nur krieg ich noch so nen error, den ich öfters habe wenn ich objekte rumschieben per move:
File "O:\GameCanvasAlt(FastFertig)\Kopie von DunkinDonutsFreak.py", line 387, in move_ghost
move_ghost()
File "O:\GameCanvasAlt(FastFertig)\Kopie von DunkinDonutsFreak.py", line 408, in move_ghost
way6_forwards()
File "O:\GameCanvasAlt(FastFertig)\Kopie von DunkinDonutsFreak.py", line 330, in way6_forwards
move_left(), move_left(), move_up(), move_left(), move_left(), move_left(), move_up(), move_up(), move_up(), move_up()
File "O:\GameCanvasAlt(FastFertig)\Kopie von DunkinDonutsFreak.py", line 269, in move_left
Field.move(Ghost, -1, 0)
File "D:\Python\lib\lib-tk\Tkinter.py", line 2256, in move
self.tk.call((self._w, 'move') + args)
TclError: invalid command name ".23710016.23710456"


verstehe da den fehler net?

Edit: passiert auch nur wenn ich das spiel während die runde läuft beende
Benutzeravatar
Leonidas
Administrator
Beiträge: 16023
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Beitragvon Leonidas » Montag 21. Januar 2008, 22:40

arris hat geschrieben:
Saob hat geschrieben:

Code: Alles auswählen

            MainWindow.after(20000, func=new_watch)
            MainWindow.after(30000, func=new_specialdonut)


Fast richtig. Das "func=" ist zuviel. Die Signatur der Funktion (...ms, func = None...) sagt Dir nur, dass, wenn keine Funktion angegeben wird, der Parameter mit None belegt wird. Hast Du eine Funktion, gib sie einfach an, ohne das "func = "

Sollte keinen Unterschied machen, da man Funktionen so immer mit Keywort-Argumenten aufrufen kann.
My god, it's full of CARs! | Leonidasvoice vs Modvoice
Saob
User
Beiträge: 23
Registriert: Mittwoch 12. Dezember 2007, 20:11
Kontaktdaten:

Beitragvon Saob » Dienstag 22. Januar 2008, 14:17

also gestern ging alles, habs heute in der schule nochmal zocken wollen und sah das der countdown nicht mehr runtertickte, garkeine special donuts und watches mehr spawnen. also das mit dem .after funzt irgendwie nichtmehr?
sieht so aus:

Code: Alles auswählen

    elif event.keysym == "g":
        Field.delete(Info1, Info2, Info3, Info4, Info5, Info6, Info7, Info8, Info9, Info10, Info11, Info12, Info13, Info14, Info15)
        if GameStarted == 0:
            GameStarted=1
            new_donut()
            ghost()
            MainWindow.after(1000, countdown)           
            MainWindow.after(20000, new_watch)
            MainWindow.after(30000, new_specialdonut)
Saob
User
Beiträge: 23
Registriert: Mittwoch 12. Dezember 2007, 20:11
Kontaktdaten:

Beitragvon Saob » Samstag 2. Februar 2008, 00:54

keiner ne idee? :?: :(

naja ansonsten hät ich da noch ne frage. wie kann man mit Python (oder ist es überhaupt möglich, ich denke aber mal schon) klicks etc durch ein netztwerk zu schicken? z.B. das man von einem anderen rechner im netztwerk auf die mainloop() zugreifen kann, und z.B. eine 2te figur steuern kann oder ähnliches. würde mich sehr interessieren ;)

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder