2013-02-28 78 views
1

我想创建一个草稿板的游戏板。 起初,一切正常,而我正在“棋盘”画布上直接绘制正方形和棋子。因为之后我必须操纵这些棋子,所以我希望通过将每个棋子和棋子作为对象来使它更加明确。 所以我试图创建一个包含黑色或白色方块的棋盘,其中将包含圆圈(棋子)。然后,一切都搞砸了。我不知道为什么。即使如此,它看起来完全合乎逻辑(对我而言)。Tkinter,草稿板

我认为这与使用pack方法有关。

下面的代码:

from tkinter import * 



class Parent(Tk): 

    def getRoot(self): 
     return(self.body) 

    def setTitle(self,title): 
     self.title(title) 

    def run(self): 
     self.mainloop() 

class Drawing: 
    def __init__(self,root,width,height): 
     self.zone=Canvas(root, width=width, height=height) 

    def put(self,root,row,col): 
     self.zone.grid(root,row=row,column=col) 

    def getDrawing(self): 
     return(self.zone) 

    def rectangle(self,coordX1,coordY1,coordX2,coordY2,color): 
     self.zone.create_rectangle(coordX1,coordY1,coordX2,coordY2,fill=color, outline="black") 

    def circle(self,coordX1,coordY1,coordX2,coordY2,color): 
     self.zone.create_oval(coordX1,coordY1,coordX2,coordY2,fill=color,outline="black") 

if __name__=="__main__": 
    root=Parent() 
    root.setTitle("Draughts") 
    board=Drawing(root,400,400) 
    size=40 
    logicBoard=[[0, -1, 0, -1, 0, -1, 0, -1, 0, -1], 
       [-1, 0, -1, 0, -1, 0, -1, 0, -1, 0], 
       [0, -1, 0, -1, 0, -1, 0, -1, 0, -1], 
       [-1, 0, -1, 0, -1, 0, -1, 0, -1, 0], 
       [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], 
       [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], 
       [0, 1, 0, 1, 0, 1, 0, 1, 0, 1], 
       [1, 0, 1, 0, 1, 0, 1, 0, 1, 0], 
       [0, 1, 0, 1, 0, 1, 0, 1, 0, 1], 
       [1, 0, 1, 0, 1, 0, 1, 0, 1, 0]] 
    DIMENSION=10 
    for i in range(DIMENSION): 
     for j in range(DIMENSION): 
      coordX1 = (i * size) 
      coordY1 = (j * size) 
      coordX2 = coordX1 + size 
      coordY2 = coordY1 + size 
      if(not(i%2==j%2)):#if the square is black (on the board) 
       color="black" 
      else: 
       color="white" 
      case=Drawing(board.getDrawing(),40,40) 
      case.rectangle(coordX1,coordY1,coordX2,coordY2,color) 
      case.getDrawing().pack() 
      if(logicBoard[i][j]>0): 
       pawnColor="white" 
      elif(logicBoard[i][j]<0): 
       pawnColor="black" 
      if (not(i%2==j%2)): 
       pawn=Drawing(case.getDrawing(),40,40) 
       pawn.circle(0,0,30,30,pawnColor) 
       pawn.getDrawing().pack() 

    board.getDrawing().pack() 
    root.run() 

谢谢!

编辑:

这就是我得到:

messed up board

+0

你是什么意思的“搞砸”? – Blender 2013-02-28 23:38:53

+0

我会发布一个截图 – 2013-02-28 23:39:32

回答

2

的问题是,你创建一个新的Canvas,并呼吁它pack()在每次迭代中,而不是使用您所创建的一个在开始时。最后,您正在使用类Drawing创建新的Drawings。我建议你只用一个类来表示所有的棋盘,用方法绘制正方形和圆形。

我已经改变了椭圆形的颜色有更好的对比:

from tkinter import Tk, Canvas 
from itertools import product 

class Board(Tk): 
    def __init__(self, width, height, cellsize): 
     Tk.__init__(self) 
     self.cellsize = cellsize 
     self.canvas = Canvas(self, width=width, height=height) 
     self.canvas.bind("<Button-1>", self.onclick) 
     self.canvas.pack() 
    def draw_rectangle(self, x1, y1, x2, y2, color): 
     self.canvas.create_rectangle(x1, y1, x2, y2, fill=color, outline="black") 
    def draw_circle(self, x1, y1, x2, y2, color): 
     self.canvas.create_oval(x1, y1, x2, y2, fill=color, outline="black") 
    def onclick(self, event): 
     i = int(event.x/self.cellsize) 
     j = int(event.y/self.cellsize) 
     print "You clicked on cell (%s, %s)" % (i, j) 

if __name__=="__main__": 
    size = 40 
    board = Board(400, 400, size) 
    board.title("Draughts") 
    logicBoard = [[0, -1, 0, -1, 0, -1, 0, -1, 0, -1], 
        [-1, 0, -1, 0, -1, 0, -1, 0, -1, 0], 
        [0, -1, 0, -1, 0, -1, 0, -1, 0, -1], 
        [-1, 0, -1, 0, -1, 0, -1, 0, -1, 0], 
        [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], 
        [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], 
        [0, 1, 0, 1, 0, 1, 0, 1, 0, 1], 
        [1, 0, 1, 0, 1, 0, 1, 0, 1, 0], 
        [0, 1, 0, 1, 0, 1, 0, 1, 0, 1], 
        [1, 0, 1, 0, 1, 0, 1, 0, 1, 0]] 
    for (i, j) in product(range(10), range(10)): 
     coordX1 = (i * size) 
     coordY1 = (j * size) 
     coordX2 = coordX1 + size 
     coordY2 = coordY1 + size 
     color = "white" if i%2 == j%2 else "black" 
     board.draw_rectangle(coordX1, coordY1, coordX2, coordY2, color) 
     cell = logicBoard[i][j] 
     if cell != 0: 
      pawnColor = "red" if cell > 0 else "blue" 
      board.draw_circle(coordX1, coordY1, coordX2, coordY2, pawnColor) 
    board.mainloop() 

编辑:

如果你想保留的点击跟踪,它是更清晰,更易于将一个处理函数绑定到画布并计算该点,而不是使用自己的事件处理函数创建大量画布。

+1

谢谢,我想这就是我一开始所做的。但我希望能够到达每个矩形和圆圈以绑定事件,以便我可以点击它们。我试图用你的代码来做,但我有同样的问题。 ...:s – 2013-03-01 10:16:09

+0

@MalikFassi我已经更新了答案;)现在,它不会区分方块或圆圈上的点击,但很容易理解。 – 2013-03-01 10:36:59

+1

谢谢;)这就是我需要的! – 2013-03-01 11:18:58