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