通过在板上单击鼠标来选择正方形的有效方法(Python 3.X. tkinter)

时间:2019-01-29 13:55:12

标签: python tkinter

我正在寻找一种通过鼠标单击从矩形板上选择正方形的更有效方法。

在工作时,我想出了一个简单的实现:

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()

使用3x3电路板看起来不错(至少对我而言),但是在设计更大的电路板时会变得非常大。有人可以建议我做一个更好的主意,或者至少指出一个正确的方向吗?谢谢!

2 个答案:

答案 0 :(得分:2)

如果您不需要画布,我认为更好的方法是构建标签。

您将需要一个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

答案 1 :(得分:1)

您可以执行以下操作:

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

//是整数除法,它将为您提供正方形网格上click事件的坐标,然后您可以使用该坐标生成平方数。