By using this site, you agree to our updated Privacy Policy and our Terms of Use. Manage your Cookies Settings.
444,199 Members | 1,120 Online
Bytes IT Community
+ Ask a Question
Need help? Post your question and get tips & solutions from a community of 444,199 IT Pros & Developers. It's quick & easy.

Tkinter help, please...

P: n/a
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

May 24 '07 #1
Share this Question
Share on Google+
2 Replies


P: n/a
I've made a couple of minor changes to your code from the Cribbage class
down:

class Cribbage:
def __init__(self, win):

self.parent = win # <---- make the toplevel Tk window an
# <---- attribute of the class
#Draw the interface
self.f = Frame(self.parent)
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):
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.
self.parent.update() <---- update the toplevel window
return score

def main():
win = Tk()
run = Cribbage(win)
score = 0
best = 0
while score < 24:
score = run.play()
if score >= best: best = score
time.sleep(1) <--- short sleep to see what's happening
win.mainloop()

main()

Regards,

John
May 24 '07 #2

P: n/a
John McMonagle wrote:
I've made a couple of minor changes to your code from the Cribbage class
down:

class Cribbage:
def __init__(self, win):
....
score = run.play()
if score >= best: best = score
time.sleep(1) <--- short sleep to see what's happening
win.mainloop()

main()

Regards,

John
Thank you, Mr. McMonagle!

--
Posted via a free Usenet account from http://www.teranews.com

May 25 '07 #3

This discussion thread is closed

Replies have been disabled for this discussion.