2017-04-16 7 views
1

私が取り組んでいるプロジェクトでは、tkinterを使ってゲームボードを作っています。これまでにtkinterを使ったことはありません。私が望むものTkinterのタイルの20x20グリッドを作成して特定のタイルの色を変更する方法

私はcanvas.createRectangle()を使用して20x20の四角形のボードを作成しました。指定されたピースの色を変更することはできません(例:8行目と12列目のピースを指定します)。

特定のタイルの色を変更する方法が必要です。任意の座標をとり、指定された色に色を変更します。

createRectangleを使用するよりも良い方法があれば教えてください!

私がしようとしたのは、作成された各矩形にタグを設定することでしたが、タグを使用して各矩形を参照する方法を理解できませんでした。

#imports 
from tkinter import * 

#-------------- SET UP THE WINDOW FRAME -------------------------------- 
class launchScreen(Frame): 
    #set the initial size of the window please change width and height 
    #it uses these values to determine the window size 
    #if you are on a resolution that is not 1920x1080 

    def __init__(self, master=None, width=0.5, height=0.4): 
     Frame.__init__(self, master) 
     #pack the frame to cover the whole window 
     self.pack(side=TOP, fill=BOTH, expand=YES) 

     # get screen width and height 
     ws = self.master.winfo_screenwidth() 
     hs = self.master.winfo_screenheight() 

     w = ws*width 
     h = ws*height 
     # calculate position x, y 
     x = (ws/2) - (w/2) 
     y = (hs/2) - (h/2) 
     self.master.geometry('%dx%d+%d+%d' % (w, h, x, y)) 

     #Make the screen appear on top of everything. 
     self.master.overrideredirect(True) 
     self.lift() 
#Once it has launched do everything in Main 
if __name__ == '__main__': 
    root = Tk() 
    #set the title of the applicaton window 
    root.title('Blokus') 

#--------------------- GAME STARTED ---------------------------------------- 
    def gameStart(): 

     print("Game Started") 
     #get rid of the launch screen elemenets and show the game board 
     LaunchScrn.pack_forget() 

     #this is where the 20x20 grid is made 
     #set up the view of the game board 
     def board(view): 
      w=view.winfo_width() 
      h=view.winfo_height() 
      gridWidth = w/20 
      gridHeight = h/20 
      rowNumber = 0 
      for row in range(20): 
       columnNumber = 0 
       rowNumber = rowNumber + 1 
       for col in range(20): 
         columnNumber = columnNumber + 1 
         rect = view.create_rectangle(col * gridWidth, 
         row * gridHeight, 
         (col + 1) * gridWidth, 
         (row + 1) * gridHeight, 
         fill = '#ccc') 
         #Sets row, column 
         view.itemconfig(rect, tags=(str(rowNumber), str(columnNumber))) 


     #set up the canvas for the game board grid 
     viewCanvas = Canvas(root, width=root.winfo_width(), height=root.winfo_height(),bg="#ddd") 
     viewCanvas.pack(side=TOP, fill=BOTH,padx=1,pady=1) 

     #when you click on the gameboard this event fires 
     def clickOnGameBoard(event): 
      if viewCanvas.find_withtag(CURRENT): 
       print(viewCanvas.gettags(CURRENT)) 
       print(type(viewCanvas.gettags(CURRENT))) 
       viewCanvas.itemconfig(CURRENT, fill="yellow") 
       viewCanvas.update_idletasks() 
     #bind an event when you click on the game board 
     viewCanvas.bind("<Button-1>", clickOnGameBoard) 

     #update the game board after it is done being drawn. 
     root.update_idletasks() 

     #show the gameboard in the Canvas 
     board(viewCanvas) 

     #when you click the quit button it returns you to the launch screen 
     def clickToQuit(event): 
      viewCanvas.destroy() 
      label.pack_forget() 
      LaunchScrn.pack(side=TOP, fill=BOTH, expand=YES) 

     #sets up the button for the quit 
     quitPath = "images/exit.gif" 
     quitImg = PhotoImage(file=quitPath) 
     label = Label(root, image=quitImg) 
     label.image = quitImg # you need to cache this image or it's garbage collected 
     #binds clicking this label to the quit event 
     label.bind("<Button-1>",clickToQuit) 
     label.pack(side=LEFT) 

#------------ GAME ENDED -------------------- 
    def gameEnd(): 
     #quits the game 
     def quitGame(): 
      print("Game Ended") 
      LaunchScrn.after(3000,root.destroy()) 
     quitGame() 

#---------------------------- LAUNCH SCREEN -------------------------------------------- 
    LaunchScrn = launchScreen(root) 
    LaunchScrn.config(bg="#eee") 

    b=Button(LaunchScrn, command=gameStart) 
    photo2=PhotoImage(file="images/start.gif") 
    b.config(image=photo2, width="300", height="50") 
    b.pack(side=RIGHT, fill=X, padx=10, pady=10) 

    b=Button(LaunchScrn, command=gameEnd) 
    photo4=PhotoImage(file="images/quit.gif") 
    b.config(image=photo4, width="300", height="50") 
    b.pack(side=RIGHT, fill=X, padx=10, pady=10) 

    root.mainloop() 

は、ゲームボード表示するには:ここで

は、私がこれまで持っているものである

  1. 起動Pythonのファイルを
  2. 右ボタンをクリック(両方のボタンは空白です)
  3. あなたはゲームボードを見ています。コードに関する

重要情報:

  • 私は他の多くのコードを削除する必要がありましたので、これは割り当てのためであるが、これは私が解決する手助けが必要かを示すために十分でなければなりません。
  • このGUIは、1920x1080の解像度でのみ表示されますが、幅と高さの値を変更することで変更できます。 (これは質問には関係しませんが、あなた自身のテストのために実行したい場合は役に立ちます)
  • ボタンで使用した画像は削除されました
  • 右のボタンは、左側の
  • ボタンがゲーム
  • を閉じてスケーリングすることができない事実は助けることができる誰にもそんなに事前に

おかげで、問題はありません!ここで

+0

あなたがこれまでに試したことと、期待される動作からどのように逸脱しているかを教えてください。 –

+0

私は今まで持っているコードを表示するために投稿を更新しました。基本的には、その特定のタイルをクリックすることなく正方形に色を付ける方法が必要です。 – nelKorajkic

+0

作成した矩形のIDを保存する必要があります。後で '.itemconfig()'に渡すことができます。リストのリスト、または(行、列)タプルをキーとする辞書は合理的な選択肢です。 – jasonharper

答えて

1

更新されたコードです:基本的に、私はchangecolorという関数を定義し

#imports 
from tkinter import * 

#-------------- SET UP THE WINDOW FRAME -------------------------------- 
class launchScreen(Frame): 
    #set the initial size of the window please change width and height 
    #it uses these values to determine the window size 
    #if you are on a resolution that is not 1920x1080 

    def __init__(self, master=None, width=0.5, height=0.4): 
     Frame.__init__(self, master) 
     #pack the frame to cover the whole window 
     self.pack(side=TOP, fill=BOTH, expand=YES) 

     # get screen width and height 
     ws = self.master.winfo_screenwidth() 
     hs = self.master.winfo_screenheight() 

     w = ws*width 
     h = ws*height 
     # calculate position x, y 
     x = (ws/2) - (w/2) 
     y = (hs/2) - (h/2) 
     self.master.geometry('%dx%d+%d+%d' % (w, h, x, y)) 

     #Make the screen appear on top of everything. 
     self.master.overrideredirect(True) 
     self.lift() 
#Once it has launched do everything in Main 
if __name__ == '__main__': 
    root = Tk() 
    #set the title of the applicaton window 
    root.title('Blokus') 
    coordinate={} 
    def changecolor(row, column, canvas): 
     canvas.itemconfig(coordinate[(row, column)], fill='yellow') 

#--------------------- GAME STARTED ---------------------------------------- 
    def gameStart(): 
     global coordinate 
     print("Game Started") 
     #get rid of the launch screen elemenets and show the game board 
     LaunchScrn.pack_forget() 

     #this is where the 20x20 grid is made 
     #set up the view of the game board 
     def board(view): 
      coordinate={} 
      w=view.winfo_width() 
      h=view.winfo_height() 
      gridWidth = w/20 
      gridHeight = h/20 
      rowNumber = 0 
      for row in range(20): 
       columnNumber = 0 
       rowNumber = rowNumber + 1 
       for col in range(20): 
         columnNumber = columnNumber + 1 
         rect = view.create_rectangle(col * gridWidth, 
         row * gridHeight, 
         (col + 1) * gridWidth, 
         (row + 1) * gridHeight, 
         fill = '#ccc') 
         #Sets row, column 
         view.itemconfig(rect, tags=(str(rowNumber), str(columnNumber))) 
         coordinate[(row,col)]=rect 
      return coordinate 

     #set up the canvas for the game board grid 
     viewCanvas = Canvas(root, width=root.winfo_width(), height=root.winfo_height(),bg="#ddd") 
     viewCanvas.pack(side=TOP, fill=BOTH,padx=1,pady=1) 

     #when you click on the gameboard this event fires 
     def clickOnGameBoard(event): 
      if viewCanvas.find_withtag(CURRENT): 
       print(viewCanvas.gettags(CURRENT)) 
       print(type(viewCanvas.gettags(CURRENT))) 
       viewCanvas.itemconfig(CURRENT, fill="yellow") 
       viewCanvas.update_idletasks() 
     #bind an event when you click on the game board 
     viewCanvas.bind("<Button-1>", clickOnGameBoard) 

     #update the game board after it is done being drawn. 
     root.update_idletasks() 

     #show the gameboard in the Canvas 
     coordinate=board(viewCanvas) 
     changecolor(1, 2, viewCanvas) 

     #when you click the quit button it returns you to the launch screen 
     def clickToQuit(event): 
      viewCanvas.destroy() 
      label.pack_forget() 
      LaunchScrn.pack(side=TOP, fill=BOTH, expand=YES) 

     #sets up the button for the quit 
     quitPath = "images/exit.gif" 
     quitImg = PhotoImage(file=quitPath) 
     label = Label(root, image=quitImg) 
     label.image = quitImg # you need to cache this image or it's garbage collected 
     #binds clicking this label to the quit event 
     label.bind("<Button-1>",clickToQuit) 
     label.pack(side=LEFT) 




#------------ GAME ENDED -------------------- 
    def gameEnd(): 
     #quits the game 
     def quitGame(): 
      print("Game Ended") 
      LaunchScrn.after(3000,root.destroy()) 
     quitGame() 

#---------------------------- LAUNCH SCREEN -------------------------------------------- 
    LaunchScrn = launchScreen(root) 
    LaunchScrn.config(bg="#eee") 

    b=Button(LaunchScrn,text='start', command=gameStart) 
    #photo2=PhotoImage(file="images/start.gif") 
    #b.config(image=photo2, width="300", height="50") 
    b.pack(side=RIGHT, fill=X, padx=10, pady=10) 

    b=Button(LaunchScrn, text='end',command=gameEnd) 
    #photo4=PhotoImage(file="images/quit.gif") 
    #b.config(image=photo4, width="300", height="50") 
    b.pack(side=RIGHT, fill=X, padx=10, pady=10) 

    root.mainloop() 

。私はまた、行88でその関数の呼び出しの例を持っていました。タイルにアクセスする際の問題については、関数に2行を追加して、作成したすべてのタイルを辞書に格納しました。その辞書のキーはタプル(row, column)で、ゼロから始まります。また、私はあなたがボタンに使用する画像を持っていないので、私はスクリプトを実行できるようにテキストに変更しました。それらを元に戻してください。

+0

私はあなたの 'gameStart'関数の外であなたのキャンバスにアクセスする方法を理解する必要があると思います。これをグローバル変数にするか、それを返すか、クラス内で 'gameStart'関数を作ることができます。 – pkqxdd

+0

これは私が必要としていることを正確に行い、さらに統合の中で、必要が生じた場合にグローバル変数にすることに目を向けます。どうもありがとうございます! – nelKorajkic

関連する問題