#python #tkinter
#python #tkinter
Вопрос:
Как вы можете видеть в моем коде, я нахожусь в процессе создания кнопок, которые должны чередоваться с черно-белыми. Однако, если пользователь нажимает на одну из этих кнопок, должны быть выведены соответствующие координаты. Моя цель — вывести поле размером 8×8, где каждое поле или кнопка чередуются с цветом от черного до белого (например, шахматная доска), и вы можете запросить координаты каждого поля. Я уже пробовал несколько попыток с циклами for, но безуспешно. Поскольку я не хочу создавать 64 разных кнопки, должен быть какой-то способ обойти это. Может кто-нибудь дать мне несколько советов или предложений о том, как я мог бы решить эту проблему?
Вот мой код:
from tkinter import *
import tkinter as tk
window = Tk()
window.geometry('600x600')
def btn_1(event):
print("00")
button1 = Button(window, width=10, height=4, bg='black')
button1.grid(row=0, column=0)
button1.bind("<Button-1>", btn_1)
def btn_2(event):
print("01")
button2 = Button(window, width=10, height=4, bg='white')
button2.grid(row=0, column=1)
button2.bind("<Button-1>", btn_2)
window.mainloop()
Ответ №1:
def coordinates(x,y):
print(x,y)
for i in range(8):
if i%2==0:
for k in range(8):
if k%2 ==0:
tk.Button(root,bg="black",command=lambda x=i,y=k: coordinates(x,y)).grid(row=i,column=k)
else:
tk.Button(root,bg="white",command=lambda x=i,y=k: coordinates(x,y)).grid(row=i,column=k)
else:
for k in range(8):
if k%2 ==0:
tk.Button(root,bg="white",command=lambda x=i,y=k: coordinates(x,y)).grid(row=i,column=k)
else:
tk.Button(root,bg="black",command=lambda x=i,y=k: coordinates(x,y)).grid(row=i,column=k)
Этот блок кода создает поле размером 8×8, похожее на шахматную доску. Вы можете указать параметры кнопки. Я указал только цвета, поскольку это пример.
Комментарии:
1. Этот выглядит довольно хорошо. Но знаете ли вы, как я могу координировать кнопки? Например, 00, 01,…
2. Зачем вам нужно их «координировать»? Является ли причиной узнать, какая кнопка была нажата, когда пользователь нажимает кнопку?
3. Мой учитель дал мне задание, чтобы мне нужно было координировать эти кнопки. Каждый раз, когда пользователь нажимает одну из этих кнопок, он должен знать, какова позиция этой кнопки. Это означает, что если я нажму кнопку, например, в 4-й строке / 3-м столбце, она должна содержать ’32’ в качестве ответа.
4. Я отредактировал свой ответ. Теперь он выполняет оба из того, что вы хотите.
5. Большое спасибо, чувак! Я люблю тебя, ты лучший! Но можете ли вы объяснить мне, как работают эти циклы for?
Ответ №2:
При привязке кнопок добавьте лямбду в качестве функции.
Например:
def click(x, y):
print(str(x) str(y))
for x in range(8):
for y in range(8):
if ((x 1) * (y 1)) % 2 == 0:
button = tk.Button(root, bg='white').grid(row=x, column=y)
else:
button = tk.Button(root, bg='white').grid(row=x, column=y)
button.bind('<Button-1>', lambda x=x, y=y: click(x, y))
Будет вызвана функция click, и координаты кнопки будут переданы в качестве аргументов x и y.
Ответ №3:
Вы можете вычислить необходимые значения с помощью относительно простых математических операций, чтобы выполнить то, что вам нужно (и встроенную divmod()
функцию, чтобы сделать это немного быстрее). Это также позволяет сделать код более «управляемым данными», избегая необходимости жестко кодировать числовые значения во многих местах.
import tkinter as tk
window = tk.Tk()
window.geometry('600x600')
WIDTH, HEIGHT = 8, 8
GRID_SIZE = WIDTH * HEIGHT
COLORS = 'black', 'white'
def callback(row, col):
print(f'{row}{col}')
for i in range(GRID_SIZE):
row, col = divmod(i, WIDTH)
offset = row % 2
color = COLORS[(i offset) % 2]
btn = tk.Button(window, width=10, height=4, bg=color,
command=lambda row=row, col=col: callback(row, col))
btn.grid(row=row, column=col)
window.mainloop()