Kleines Game mit Tkinter - Brauche Hilfe

Fragen zu Tkinter.
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
Saob
User
Beiträge: 23
Registriert: Mittwoch 12. Dezember 2007, 20:11
Kontaktdaten:

habe ich, finde ja nur leider nichts wie oben schon gesagt :(
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Dann schau mal hier.
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 hab mal nach dem example den server gemacht, geht aber bei mir nicht :?:

Code: Alles auswählen

Traceback (most recent call last):
  File "O:/PyOGame(todo)/Client.py", line 4, in <module>
    print s.pow(2,3)  # Returns 2**3 = 8
  File "D:\Python25\lib\xmlrpclib.py", line 1147, in __call__
    return self.__send(self.__name, args)
  File "D:\Python25\lib\xmlrpclib.py", line 1437, in __request
    verbose=self.__verbose
  File "D:\Python25\lib\xmlrpclib.py", line 1185, in request
    errcode, errmsg, headers = h.getreply()
  File "D:\Python25\lib\httplib.py", line 1195, in getreply
    response = self._conn.getresponse()
  File "D:\Python25\lib\httplib.py", line 924, in getresponse
    response.begin()
  File "D:\Python25\lib\httplib.py", line 385, in begin
    version, status, reason = self._read_status()
  File "D:\Python25\lib\httplib.py", line 343, in _read_status
    line = self.fp.readline()
  File "D:\Python25\lib\socket.py", line 331, in readline
    data = recv(1)
error: (10054, 'Connection reset by peer')
Saob
User
Beiträge: 23
Registriert: Mittwoch 12. Dezember 2007, 20:11
Kontaktdaten:

ist aus :?
Antworten