[Tkinter-discuss] strange bind problem...
Martin Franklin
mfranklin1 at gatwick.westerngeco.slb.com
Thu Sep 30 12:54:29 CEST 2004
Hi All,
Hope you can help I have written a quick HangMan game for my 6
year old son - not me ;-)
And it works great..... but when the word changes, after guessing
all the right letters, I get an extra 'guess' at the start of the next
word. I guess you would have to run it to see what I mean...
Sorry it's a bit long
from Tkinter import *
from string import letters, lowercase
import random
import time
import os
import sys
FONT = "Courier 36 bold"
class HangMan(Tk):
def __init__(self):
Tk.__init__(self)
self.title("HangMan")
self.bind("<Any-Key>", self.binder)
self.words = ["oyster", "toy", "destroy", "employ", "convoy",
"royal", "cowboy", "enjoy", "annoy", "voyage"]
random.shuffle(self.words)
f = Frame(self)
self.canvas = Canvas(f, background = "white", width = 300,
height=300)
self.canvas.pack(side = "left")
self.drawman()
self.letters = {}
lf = Frame(f)
col = 0
row = 0
for letter in lowercase:
l = Label(lf, text=letter, font=FONT)
l.grid(row=row, column=col)
self.letters[letter] = l
col = col + 1
if col == 6:
row = row + 1
col = 0
lf.pack(side = "left")
f.pack()
f = Frame(self)
self.theword = Label(f, text="_ _ _ _ _", font=FONT)
self.theword.pack(side="left")
f.pack(fill="x")
self.setword()
def setword(self):
self.guessed = []
self.currentword = self.words.pop()
self.theword.config(text="_ " * len(self.currentword))
for l in self.letters.values():
l.config(fg = "black")
def binder(self, event):
key = event.keysym
print "binder called", event.keycode, key
if key not in letters:
## ignore
return "break"
if key not in self.guessed:
self.guessed.append(key)
self.strike(key)
self.showletter()
if key not in self.currentword:
self.shownext()
return "break"
return "break"
def shownext(self):
## draw the next part of the hang man
try:
id = self.bodyparts.pop()
except:
## try this word again!
self.showword()
time.sleep(4)
self.drawman()
self.words.append(self.currentword)
self.setword()
return "break"
try:
self.canvas.itemconfig(id, outline="black")
except:
self.canvas.itemconfig(id, fill="black")
def showword(self):
self.theword.config(text=self.currentword)
self.update()
def showletter(self):
#~ print "showletter called"
out = []
for c in self.currentword:
if c in self.guessed:
out.append(c)
else:
out.append("_")
self.theword.config(text=" ".join(out))
self.update()
if "_" in out:
# keep going....
pass
else:
time.sleep(4)
self.drawman()
self.setword()
def strike(self, letter):
l = self.letters[letter]
l.config(fg = "red")
def drawman(self):
self.canvas.delete("all")
self.bodyparts = []
id = self.canvas.create_line(50, 250, 250, 250, fill="white")
self.bodyparts.append(id)
id = self.canvas.create_line(50, 250, 50, 50, fill="white")
self.bodyparts.append(id)
id = self.canvas.create_line(50, 50, 150, 50, fill="white")
self.bodyparts.append(id)
id = self.canvas.create_line(150, 50, 150, 75, fill="white")
self.bodyparts.append(id)
# head
id = self.canvas.create_oval(140, 75, 160, 95, outline="white")
self.bodyparts.append(id)
id = self.canvas.create_line(150, 95, 150, 150, fill="white")
self.bodyparts.append(id)
# leg
id = self.canvas.create_line(150, 150, 125, 175, fill="white")
self.bodyparts.append(id)
# leg
id = self.canvas.create_line(150, 150, 175, 175, fill="white")
self.bodyparts.append(id)
# arm
id = self.canvas.create_line(150, 95, 125, 115, fill="white")
self.bodyparts.append(id)
# arm
id = self.canvas.create_line(150, 95, 175, 115, fill="white")
self.bodyparts.append(id)
self.bodyparts.reverse()
hm = HangMan()
hm.mainloop()
Hope you can help,
Martin.
--
Using M2, Opera's revolutionary e-mail client: http://www.opera.com/m2/
More information about the Tkinter-discuss
mailing list