Kleines Game mit Tkinter - Brauche Hilfe

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

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:

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

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:

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:

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:

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:

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
>>> 
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

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 (former) Modvoice
Saob
User
Beiträge: 23
Registriert: Mittwoch 12. Dezember 2007, 20:11
Kontaktdaten:

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

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:

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:

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
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

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 (former) Modvoice
Saob
User
Beiträge: 23
Registriert: Mittwoch 12. Dezember 2007, 20:11
Kontaktdaten:

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:

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 ;)
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Du suchst glaube ich so etwas wie Remote Procedure Calls - RPC. Guck dir mal XML-RPC an.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Saob
User
Beiträge: 23
Registriert: Mittwoch 12. Dezember 2007, 20:11
Kontaktdaten:

hab ma bissl gegoogelt, sehe aber das XML-RPC dings bezieht sich wohl sehr stark fürs arbeiten übers Internet?
was ich halt machen will, ist ein Server, auf dem die variablen gespeichert sind, und sich vom client verändern lassen übers LAN
z.B.:
Server:
PlayerAGold=1000
Client:
PlayerAGold=PlayerAGold + 100

das also auf die variablen zugegriffen werden kann, welche sich auf dem anderen PC befinden
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Ob Internet oder LAN, beide nutzten TCP, von daher lässt sich auch XML-RPC dort einsetzen.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Saob
User
Beiträge: 23
Registriert: Mittwoch 12. Dezember 2007, 20:11
Kontaktdaten:

na wenn das so ist, dann immer her damit :) finde nur leider keine nützlichen Tutorials, nur seiten wo erklärt wird was man damit erreichen kann und ähnliches. so in der art Snkale Wrangling for Kids wäre perfekt wenn sowas existiert :?:
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Schon mal die Suchfunktion ausprobiert?
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Antworten