I think that's supposed to be [(i + j) % 2] for the index to the ("green","red") tuple (since i*8 is always even).
[EMAIL PROTECTED] wrote: > Mike, > > Thanks for your insight. It has been a big help. > > I guess I was trying to learn too much with my original code. Trying to > implement inheritance, object creation, calling methods via inheritance > made the code harder than it needed to be. > > I'm off to study the code. (Hmm.. how does python parse ("green", > "red")[(i * 8 + j) % 2] command ... he says while reaching for "python > for the semi-illiterate" ...) > > Again, thanks for your help. > > > Jpl > > > Mike Meyer wrote: > > "solaris_1234" <[EMAIL PROTECTED]> writes: > > > > > 1) The stmt "board.Blist[10].DrawQueen(board.Blist[10].b1)" seems > > > awkward. Is there another way (cleaner, more intuitive) to get the > > > same thing done? > > > > Yes. Reaching through objects to do things is usually a bad idea. Some > > languages don't allow you to do that at all; they require you to > > provide methods for manipulating the state of the object For instance, > > you can extend your MyBoard class with an extra method: > > > > def DrawQueen(self, cell): > > square = self.Blist[cell] > > square.DrawQueen(square.b1) > > > > > > And then those two lines become: > > > > board.DrawQueen(10) > > board.DrawQueen(22) > > > > Except that's still ugly - you probably want something like > > board.DrawQueen(1, 2). > > > > Basically, Blist should be part of MyBoards implementation, not a > > visible attribute. You should define methods for MyBoard that let > > clients manipulate the board, without needing to know how it's > > represented internally. > > > > Along the same lines, why does MyBoard inherit from MyBox? It's not > > using any of the features of MyBox. The code still works if you don't > > do that. And why do you pass instances of Cavnas to the methods of > > MyBox - it's got a canvas already! Do you really expect a MyBox to > > draw onto Canvases other than it's own (if so, that's a bad design as > > well). > > > > Here's an updated version of your code. I've used the convention of an > > _ prefix on attributes to indicate implementation details, and made > > the classes inherit from object, as well as using "box" instead of > > "b1", and changed the interface to MyBoard squares to use standard > > 2d-array indexing instead of forcing the clients to do array > > index calculations. You may have a good reason for doing these things > > that doesn't appear in your code fragment, but I consider these to be > > improvements in the fragment. > > > > Hmm. "b1" seems to indicate that you will eventually have more than > > one canvas, which is why you passed in the canvas? In which case, the > > distinguishing feature would be the number (or mabye the "b1"). In > > that case, have your clients pass in the number (or name), and look up > > the canvas in an internal structure. > > > > <mike > > > > from Tkinter import * > > import time > > totalSolutionCount = 0 > > > > class MyBox(object): > > def __init__(self, myC, myrow, mycolumn, color): > > self._box = Canvas(myC, background=color, width=50, height=50) > > self._box.grid(row=myrow, column=mycolumn) > > self.occupied = False > > > > def ChangebgColor(self): > > self._box.config(bg="black") > > > > def DrawQueen(self): > > self._box.item = self._box.create_oval(4,4,50,50,fill="black") > > self.occupied = True > > self._box.update() > > > > def unDrawQueen(self): > > self._box.delete(self._box.item) > > self.occupied = False > > self._box.update() > > > > class MyBoard(object) : > > def __init__(self, myC): > > self._blist = {} > > for i in range(8): > > for j in range(8): > > self._blist[i, j] = MyBox(myContainer, i, j, > > ("green", "red")[(i * 8 + j) % 2]) > > def DrawQueen(self, i, j): > > square = self._blist[i, j] > > square.DrawQueen() > > > > def occupied(self, i, j): > > return self._blist[i, j].occupied > > > > > > root=Tk() > > myContainer = Frame(root) > > myContainer.pack() > > > > board=MyBoard(myContainer) > > > > board.DrawQueen(1, 2) > > board.DrawQueen(2, 6) > > > > raw_input() # A Hack debug statement > > > > for i in range(8): > > for j in range(8): > > if board.occupied(i, j): > > print "%d, %d is occupied" % (i, j) > > > > raw_input() # A Hack debug statement > > print "\n"*3 > > > > > > > > > > -- > > Mike Meyer <[EMAIL PROTECTED]> > > http://www.mired.org/home/mwm/ > > Independent WWW/Perforce/FreeBSD/Unix consultant, email for more > > information. -- http://mail.python.org/mailman/listinfo/python-list