warteschleife

Fragen zu Tkinter.
Antworten
the-flasher

Samstag 4. Januar 2003, 20:05

hi leute,
ich hab folgendes prob:
ich hab ein memory spiel in python mit hilfe von tkinter programmiert.
jetzt soll aber, wenn zwei ungleiche karten aufgedeckt sind der script kurz anhalten, damit man sich die merken kann, und dann nach einer bestimmten zeit die karten wieder umdrehen.
meine versuche mit time.sleep(2) und einer manuell programmierten warteschleife liefen nur dahin hinaus, dass man die erste karte sieht, die zweite angeklickt hat, die aber gar nicht erst gezeigt wird, sondern 2 sekunden wartet und dann die erste karte wieder umdreht ohne die zweite gezeigt zu haben.

Allerdings ist das prob deshalb verwunderlich, weil in der script reihenfolge der erst die zweite karte zeigt, dann die warteschleife und dann wieder umdrehen. jetzt überspringt der aber einfach den ersten schritt.

kann das vielleicht daran liegen, dass sich diese zeitfunktionen sich nicht mit tkinter vertragen?
Habt ihr noch ne Idee, wie man das sonst lösen könnte?

Danke im vorraus,
the-flasher

PS: ich hoffe ihr habt mein geschwafel auch verstanden ;), sonst bitte nachfragen
Milan
User
Beiträge: 1078
Registriert: Mittwoch 16. Oktober 2002, 20:52

Samstag 4. Januar 2003, 21:32

die zeitfunktionen vertragen sich schon mit tk-inter, nur würde ich mla darauf tippen, das du einen Fehler beim einsetzen des Wartens gemacht hast. Kannst du uns bitte mal den Quelltext zeigen, auch wenn er mitunter sehr lang ist? Dann können wir das mal darauf hin auch noch mal prüfen (ich zweifle nicht dran, das du das nicht schon gemacht hast)...
Gast

Samstag 4. Januar 2003, 22:03

nicht ganz sauber der script, ist aber auch noch in der entwicklungsphase :)

der braucht zum ausführen noch 6 bilder 01-06.jpg und ein back.jpg, ist egal welche größe.

danke für deine bemühungen :)

Code: Alles auswählen

#creator
#Till Juergens

#import
import Tkinter
from Tkconstants import *
import whrandom
import time
#/

class switch(Tkinter.Button):
     	def __init__(self,master, geheim, imgid, r, c, callback):
        	Tkinter.Button.__init__(self, master)
	    
        	self.backimg="back.gif"
        	self.geheim=geheim
		self.imgid=imgid
        	        
        	self.back=Tkinter.PhotoImage(file=self.backimg)
        	self.bild=Tkinter.PhotoImage(file=self.geheim)

		self.callback=callback
		
		self.grid(row=r, column=c)
        	self.config(image=self.back)
        	self.bind('<Button-1>', self.callback)
	
	def dreheum(self):
		self.config(image=self.bild, width=self.back.width(), height=self.back.height())
		self.bind('<Button-1>', self.nix)

	def disablebutton(self):
#		self.config(stat=DISABLED)
		self.bind('<Button-1>', self.nix)
		
	def dreheback(self):
		self.config(image=self.back)
		self.bind('<Button-1>', self.callback)
	
	def gibID(self):
		return self.imgid

	def nix(self, m):
		return ""
		



class spiel:
	def __init__(self, master):
		frame=Tkinter.Frame(master)
		frame.pack(fill=BOTH, expand=1)
		

		checklist=[]
		
		zahl=self.randrow(checklist)
		bild="0"+str(zahl)+".gif"
		checklist.append(zahl)
		self.karte01=switch(frame, bild, zahl, 0, 0, self.changeimage)
		
		zahl=self.randrow(checklist)
		bild="0"+str(zahl)+".gif"
		checklist.append(zahl)
		self.karte02=switch(frame, bild, zahl, 0, 1, self.changeimage)
		
		zahl=self.randrow(checklist)
		bild="0"+str(zahl)+".gif"
		checklist.append(zahl)
		self.karte03=switch(frame, bild, zahl, 0, 2, self.changeimage)
		
		zahl=self.randrow(checklist)
		bild="0"+str(zahl)+".gif"
		checklist.append(zahl)
		self.karte04=switch(frame, bild, zahl, 0, 3, self.changeimage)
		
		zahl=self.randrow(checklist)
		bild="0"+str(zahl)+".gif"
		checklist.append(zahl)
		self.karte05=switch(frame, bild, zahl, 1, 0, self.changeimage)
		
		zahl=self.randrow(checklist)
		bild="0"+str(zahl)+".gif"
		checklist.append(zahl)
		self.karte06=switch(frame, bild, zahl, 1, 1, self.changeimage)
		
		zahl=self.randrow(checklist)
		bild="0"+str(zahl)+".gif"
		checklist.append(zahl)
		self.karte07=switch(frame, bild, zahl, 1, 2, self.changeimage)
		
		zahl=self.randrow(checklist)
		bild="0"+str(zahl)+".gif"
		checklist.append(zahl)
		self.karte08=switch(frame, bild, zahl, 1, 3, self.changeimage)
		
		zahl=self.randrow(checklist)
		bild="0"+str(zahl)+".gif"
		checklist.append(zahl)
		self.karte09=switch(frame, bild, zahl, 2, 0, self.changeimage)
		
		zahl=self.randrow(checklist)
		bild="0"+str(zahl)+".gif"
		checklist.append(zahl)
		self.karte10=switch(frame, bild, zahl, 2, 1, self.changeimage)
		
		zahl=self.randrow(checklist)
		bild="0"+str(zahl)+".gif"
		checklist.append(zahl)
		self.karte11=switch(frame, bild, zahl, 2, 2, self.changeimage)
		
		zahl=self.randrow(checklist)
		bild="0"+str(zahl)+".gif"
		checklist.append(zahl)
		self.karte12=switch(frame, bild, zahl, 2, 3, self.changeimage)

		
		self.firstButton=""
		self.firstID=0


	def check(self, liste, zahl):
		i=0
		for z in liste:
			if z==zahl:
				i=i+1
		if i==2:
			return 1
		else :
			return 0

	def randrow(self, checklist):
		zahl=whrandom.randint(1,6)
		if self.check(checklist, zahl)==1:
			zahl=self.randrow(checklist)
		return zahl


	def changeimage(self, event):
		self.currentButton=event.widget
		self.currentButton.dreheum()
		currentID=self.currentButton.gibID()
		
		if self.firstButton!="":
			if currentID==self.firstID:
				self.currentButton.disablebutton()
				self.firstButton.disablebutton()
			else:
			#	self.warten()  oder time.sleep(2)
	self.currentButton.dreheback()
				self.firstButton.dreheback()
			self.firstButton=""
			self.firstID=0
		else:
			self.firstButton=self.currentButton
			self.firstID=currentID
	def warten(self):
		old=time.time()
		new=time.time()
		while 1>new-old:
			new=time.time()
        
tk=Tkinter.Tk()
start=spiel(tk) 
tk.mainloop()
hans
User
Beiträge: 728
Registriert: Sonntag 22. September 2002, 08:32
Wohnort: Sauerland
Kontaktdaten:

Sonntag 5. Januar 2003, 12:48

Du hast doch die Methode self.drehum(). Wenn du dazu einen Zähler implementierst, dann rufst du sleep() in die self.dereheum() Methode auf, wenn der Zähler gleich ist. Nach Ablauf der Zeit setzt du den Zähler zurück und verdeckst die Karten wieder.

Ohne TKInter zu können meine ich, daß das laufen müsste.

Hans
the-flasher

Montag 6. Januar 2003, 14:46

hm...klappt leider nicht. ich hab jetzt einfach in dreheum() sleep(1) eingefügt und das komische ist: die erste karte wird umgedreht aber die zweite nicht. d.h. da muss irgendwo ein kleiner script fehler sein, ich find den nur nicht :cry:

ich hab aber auch mal gehört, dass der rechner schon so viel mit tkinter beschäftigt wird, dass er einfach so "Blockfunktionen" wie sleep() nicht akzeptiert, kann das sein?
hans
User
Beiträge: 728
Registriert: Sonntag 22. September 2002, 08:32
Wohnort: Sauerland
Kontaktdaten:

Montag 6. Januar 2003, 22:11

Ich hoffe du hast ein LINUX System. Dann bau doch mal in deine dreheum() Funktion ein oder mehrere print "irgendwas" Befehle ein, Wenn du das ganze dann aus einem Terminal startest, dann schreibt der print Befehl jedesmal ins Terminal. So kannst du schon mal nachweisen, wann eine Funktion durchlaufen wird oder auch nicht.

Hans
Antworten