Эффективный способ выбора квадратов щелчками мыши с доски (Python 3.X. tkinter) - PullRequest
0 голосов
/ 29 января 2019

Я ищу более эффективный способ выбора квадратов на прямоугольной доске с помощью щелчков мыши.

Во время работы я придумал эту простую реализацию:

import tkinter as tk


def square_selector(event):
    if 1 <= event.x <= 199 and 1 <= event.y <= 199:
        print('This is square 1')
    elif 1 <= event.x <= 199 and 201 <= event.y <= 399:
        print('This is square 2')
    elif 1 <= event.x <= 199 and 401 <= event.y <= 599:
        print('This is square 3')
    elif 201 <= event.x <= 399 and 1 <= event.y <= 199:
        print('This is square 4')
    elif 201 <= event.x <= 399 and 201 <= event.y <= 399:
        print('This is square 5')
    elif 201 <= event.x <= 399 and 401 <= event.y <= 599:
        print('This is square 6')
    elif 401 <= event.x <= 599 and 1 <= event.y <= 199:
        print('This is square 7')
    elif 401 <= event.x <= 599 and 201 <= event.y <= 399:
        print('This is square 8')
    elif 401 <= event.x <= 599 and 401 <= event.y <= 599:
        print('This is square 9')
    else:
        pass


root = tk.Tk()

canvas = tk.Canvas(height=600, width=600)
canvas.pack()

canvas.create_line(0, 200, 600, 200)
canvas.create_line(0, 400, 600, 400)
canvas.create_line(200, 0, 200, 600)
canvas.create_line(400, 0, 400, 600)

canvas.bind('<Button-1>', square_selector)

root.mainloop()

Это выглядитхорошо (по крайней мере для меня) с доской 3х3, но она будет довольно большой при проектировании доски большего размера.Может ли кто-нибудь предложить мне лучшую идею для этого или, по крайней мере, указать правильное направление?Спасибо!

Ответы [ 2 ]

0 голосов
/ 29 января 2019

Если вам не нужен холст, я думаю, что вместо этого лучше будет создавать метки.

Вам понадобится изображение размером 1x1 пикселей, чтобы это работало, поскольку размер меток по умолчанию основан наразмер шрифта вместо размера пикселя.Добавляя изображение размером 1x1 пиксель к метке, мы можем затем определить высоту и ширину в пикселях.

Я также предпочитаю использовать список для хранения меток и других переменных, которые вы можете хранить рядом с меткой.

Это также масштабируется динамически.

Вам не нужно применять числа к блоку, который я только что сделал для визуального представления.

import tkinter as tk


def square_selector(square):
    print(square)

root = tk.Tk()
label_list = []
counter = 1
img = tk.PhotoImage(file='1x1.png')

grid_size = 4
box_size = 100

for x in range(grid_size):
    for y in range(grid_size):
        label_list.append(tk.Label(root, text=counter, image=img, width=box_size, height=box_size,
                                   compound='center', borderwidth=1, relief="solid"))
        label_list[-1].grid(row=x, column=y)
        label_list[-1].bind('<Button-1>', lambda e, c=counter: square_selector(c))
        counter += 1

root.mainloop()

Результаты:

enter image description here

0 голосов
/ 29 января 2019

Вы можете сделать что-то вроде этого:

def square_selector(event):
    sq_num = (event.x // 200) * 3 + (event.y // 200) + 1
    print("This is square {0}".format(sq_num))

// - целочисленное деление, и оно даст вам координаты события щелчка на квадратной сетке, которое вы затем используете для получения квадратного числа.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...