Помогите сделать своеобразные "крестики-нолики"

R_M

Новичок
Пользователь
Янв 10, 2021
24
1
3
У меня есть код, он выводит поле 3х3, как сделать так, что бы при нажатии квадраты закрашивались причем поочередно, то есть раз нажал- закрасилось красным, второй раз- зеленым, третий раз опять красным

from tkinter import *
from functools import partial
from tkinter import messagebox

root=Tk()
root.resizable(0, 0)
root.geometry("150x150")


def zm(Event,x,y):
print(Event,x)


def change(event):
b['bg'] = "#000000"
b['activeforeground'] = "#000000"
#===================================================
y=0
krd=3
kst=3
for rd in range(krd):
for st in range(kst):
b=Button(root,bg="#669999")
b.place(x=st*50,y=y,width=50,heigh=50)
xx=b.place_info()['x']
yy=y
b.bind('<Button-1>', partial(zm,xx,yy))
b.bind('<Button-1>', change)
y+=50


root.mainloop()

p.s. обьясните пожалуйста почему def change(event): окрашивает только нижнюю правую кнопку причем при нажатии на любую из девяти кнопок
 

stud_55

Модератор
Команда форума
Модератор
Апр 3, 2020
1 522
672
113
обьясните пожалуйста почему def change(event): окрашивает только нижнюю правую кнопку причем при нажатии на любую из девяти кнопок
Потому что в переменной b после цикла остается id последней кнопки.
У меня есть код, он выводит поле 3х3, как сделать так, что бы при нажатии квадраты закрашивались причем поочередно, то есть раз нажал- закрасилось красным, второй раз- зеленым, третий раз опять красным
Вот пример:
Python:
import tkinter as tk


root = tk.Tk()
root.resizable(0, 0)
root.geometry("150x150")

last_color = 'green'


def change(event):
    global last_color

    # если кнопка нажата первый раз - меняем ей цвет
    if event.widget.clicked is False:
        if last_color == 'green':
            event.widget["bg"] = 'red'
        else:
            event.widget["bg"] = 'green'
        last_color = event.widget["bg"]
        # меняем статус кнопки
        event.widget.clicked = True


for i in range(3):
    for j in range(3):
        b = tk.Button(root, bg="#669999")
        # добавляем статус кнопки (не нажата)
        b.clicked = False
        b.place(x=j * 50, y=i * 50, width=50, heigh=50)
        b.bind("<Button-1>", change)


root.mainloop()
 
  • Мне нравится
Реакции: R_M

regnor

Модератор
Команда форума
Модератор
Июл 7, 2020
2 589
459
83
код вставляйте с помощью тегов code, где пишите сообщение чуть выше в панели инструментов есть три точки далее выбираете код далее Python и туда уже вставляете свой код...
без отступов разобраться трудно в вашем коде...
 

R_M

Новичок
Пользователь
Янв 10, 2021
24
1
3
Python:
from tkinter import *
from functools import partial
from tkinter import messagebox

root=Tk()
root.resizable(0, 0)
root.geometry("150x150")

      
def zm(Event,x,y):
        print(Event,x)

      
def change(event):
    b['background'] = "#000000"

#===================================================
y=0
krd=3
kst=3
for rd in range(krd):
    for st in range(kst):
        b=Button(root,bg="#669999")
        b.place(x=st*50,y=y,width=50,heigh=50)
        xx=b.place_info()['x']
        yy=y
        b.bind('<Button-1>', partial(zm,xx,yy))
        b.bind('<Button-1>', change)
    y+=50

 
root.mainloop()
 

R_M

Новичок
Пользователь
Янв 10, 2021
24
1
3
огромное спасибо!!!
 

Форум IT Специалистов