I created a program to move a knight around a chess board touching every square without touching the same one twice, starting from a random location. I am attempting to show this action using tkinter by changing the color of the square (which is a button) to red as the knight moves.
The Chess Board is made of tkinter buttons and they relate to the "Square" class. The program sets the correct colors when creating the grid, but won't change them during execution.
Here is the reduced code (as instructed to provide).
from tkinter import *
from tkmacosx import Button
import random
import sys
WIDTH = 800
HEIGHT = 1000
GRID_SIZE = 8
class Square:
board = []
def __init__(self, x, y, touched=False):
self.touched = touched
self.board_btn_object = None
self.x = x
self.y = y
def create_btn_object(self, location):
btn = Button (
location,
width=100,
height=100,
text= f"{self.x}, {self.y}",
bg=None
)
self.board_btn_object = btn
Square.board.append(self)
@property
def is_touched(self):
self.touched = True
self.board_btn_object.configure(bg="red")
@staticmethod
def randomlocation():
return random.choice(Square.board)
def __repr__(self):
return f"Square({self.x}, {self.y}) touched={self.touched}"
class Knight:
def __init__(self, x, y):
self.x = x
self.y = y
def main():
root = Tk()
root.configure(bg='blue')
root.geometry(f'{WIDTH}x{HEIGHT}')
root.title("chess chaser")
root.resizable(False, False)
top_frame = Frame(
root,
bg = "red",
width = WIDTH,
height = height_prct(10)
)
top_frame.place(x=0, y=0)
bottom_frame = Frame(
root,
bg="black",
width = WIDTH,
height = height_prct(10)
)
bottom_frame.place(x=0, y=height_prct(90))
center_frame = Frame(
root,
bg = "green",
width = WIDTH,
height = height_prct(80)
)
center_frame.place(
x=0,
y=height_prct(10)
)
make_board(center_frame)
top_menu(top_frame)
root.mainloop()
def height_prct(percentage):
return (HEIGHT / 100) * percentage
def width_prct(percentage):
return (WIDTH / 100) * percentage
def top_menu(top_frame):
run = Button (
top_frame,
width = 100,
height = 50,
text=f"Run",
command = play_game
)
run.place(x=30, y=10)
def make_board(center_frame):
for x in range(GRID_SIZE):
for y in range(GRID_SIZE):
b = Square(x, y)
b.create_btn_object(center_frame)
b.board_btn_object.grid(
column=x, row=y
)
if (x+y) %2 ==0:
b.board_btn_object.configure(bg="grey50")
return
def play_game():
knight = place_knight()
sys.exit("Done")
def place_knight():
coords = Square.randomlocation()
coords.is_touched
x = coords.x
y = coords.y
knight = Knight(x, y)
return knight
if __name__ == "__main__":
main()
I have tried using self.board_btn_object.change(bg="red") and .update and .after.... nothing works to change the color.
If I change code and bind left click to change the button to red, it works fine; however, I want it to change when the KNIGHT is positioned there.
source https://stackoverflow.com/questions/74602264/tkinter-button-color-wont-change-non-click-event
Comments
Post a Comment