I've been away from Python for some time, and I'm just starting to look

at Tkinter. Just so you know, I'm coming from Visual Basic, where this

would, I *think*, not have been a problem, so it must be a case of

getting my head around the Tkinter way of doing things.

In a nutshell, I've written an app wherein I wish to update the display

often. What's happening is that I get *no* display until main() hits

win.mainloop(). I've indicated the things I've tried (round about line

180). At the risk of exposing myself, here's the whole thing.

If you have a thought, I'd sure appreciate it!

Nick.

from random import *

from Tkinter import *

'''

Score the "good jack"

'''

def jack(h, f):

hand = h[:]

hand.remove(f)

for card in hand:

if card.rank == 10 and card.suit == f.suit:

return 1

return 0

'''

Count and return 2 for each combination that adds up to 15

'''

def fifteen(h):

if h[0].value() + h[1].value() + h[2].value() + h[3].value() +

h[4].value() == 15:

return 2

# 4-card combos

score = 0

for a in range(0,2):

for b in range(a+1,3):

for c in range(b+1,4):

for d in range(c+1,5):

if h[a].value() + h[b].value() + h[c].value() +

h[d].value() == 15:

score += 2

# 3-card combos

for a in range(0,3):

for b in range(a+1,4):

for c in range(b+1,5):

if h[a].value() + h[b].value() + h[c].value() == 15:

score += 2

# 2-card combos

for a in range(0,4):

for b in range(a+1,5):

if h[a].value() + h[b].value() == 15:

score += 2

return score

'''

Simplified flush rules:

Try the 4 flush and 5 flush, give the best score.

'''

def flushes(h, f):

# 5-flush

suit = h[0].suit

total = 0

for card in h:

if card.suit == suit:

total += 1

#end if

#end for

if total == 5: return 5

# 4-flush

hand = h[:]

hand.remove(f)

suit = hand[0].suit

total = 0

for card in hand:

if card.suit == suit:

total += 1

if total == 4:

return 4

return 0

'''

1 Point per card per run

'''

def runs(h):

# Is there a 5-run?

if h[0].rank == h[1].rank-1 and h[1].rank == h[2].rank-1 and \

h[2].rank == h[3].rank-1 and h[3].rank == h[4].rank-1 :

return 5

# Look for 4-runs:

score = 0

for a in range(0,2):

for b in range(a+1,3):

for c in range(b+1,4):

for d in range(c+1,5):

if h[a].rank == h[b].rank-1 and h[b].rank ==

h[c].rank-1 \

and h[c].rank == h[d].rank-1:

score += 4

if score != 0:

return score

#Look for 3-runs

for a in range(0,3):

for b in range(a+1,4):

for c in range(b+1,5):

if h[a].rank == h[b].rank-1 and h[b].rank == h[c].rank-1:

score += 3

return score

'''

Two points per pair

'''

def pairs(h):

'''

Tally me hand

'''

score = 0

for left in range(0,4):

for right in range(left+1, 5):

if h[left].rank == h[right].rank:

score += 2

return score

def tally(h, f):

return pairs(h) + runs(h) + flushes(h, f) + fifteen(h) + jack(h, f)

class Card:

def __init__(self, r, s):

self.rank = r

self.suit = s

def value(self):

return min([self.rank+1, 10])

def __repr__(self):

s = "HSCD"[self.suit]

r = "A23456789TJQK"[self.rank]

return r+s

__str__ = __repr__

class Deck:

def __init__(self):

self.deck = []

for r in range(13):

for s in range(4):

self.deck.append(Card(r,s))

shuffle(self.deck)

#self.card = 0

def deal(self):

#self.card += 1

if len(self.deck) == 2:

self.deck = []

for r in range(13):

for s in range(4):

self.deck.append(Card(r,s))

shuffle(self.deck)

return self.deck.pop()

class Cribbage:

def __init__(self, win):

#Draw the interface

self.f = Frame(win)

self.f.grid()

self.cardpix = [Label(self.f), Label(self.f), Label(self.f),

Label(self.f), Label(self.f)]

clr = ["red", "blue"]

n = 1

for c in self.cardpix:

c.configure(width=10, height=10, bg=clr[n%2], text="card

"+str(n))

c.grid(row=0, column=n-1)

n += 1

self.scorebox = Label(self.f)

self.scorebox.configure(height=5, bg="green", text="Score: 0")

self.scorebox.grid(row=1, column=0, columnspan=5)

def play(self, win):

d = Deck()

hand = [d.deal(), d.deal(), d.deal(), d.deal()]

flipped = d.deal()

hand.append(flipped)

hand.sort()

score = tally(hand, flipped)

self.scorebox.configure(text= "Score: " + str(score))

#Eventually, display the actual card images, but for now...

for c, x in zip(hand, self.cardpix):

x.configure(text = str(c))

#I've tried both of these, to no avail.

win.iconify()

self.f.update_idletasks()

return score

def main():

win = Tk()

run = Cribbage(win)

score = 0

best = 0

while score < 24:

score = run.play(win)

if score >= best: best = score

win.mainloop()

main()

--

Posted via a free Usenet account from

http://www.teranews.com