Tkinter help, please...

Medi Ochre mediocre_person at hotmail.com
Thu May 24 18:18:46 EDT 2007


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




More information about the Python-list mailing list