Почему этот холст на один пиксель слишком большой? - PullRequest
2 голосов
/ 29 октября 2019

MCVE

import Tkinter as tk

root = tk.Tk()
canvas = tk.Canvas(root, width=100, height=100)
canvas.grid(row=0, column=0)

def print_click(event):
    print event.x, event.y

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

root.mainloop()

Issue

Нажатие на холст на верхнем левом отпечатке (0, 0).
Нажатие нахолст в самом низу справа печатает (100, 100). Я ожидал (99, 99).

Это означает, что холст на самом деле имеет ширину 101 пиксель и высоту, а не 100.

В моей реальной программе я показываю массив (как изображение) нахолст и нужно точное положение щелчка. Если эта позиция не существует в базовом изображении (например, (100, 100) для массива 100x100), программа завершится сбоем.

Вопросы

  1. Am Iделаете что-то не так, создавая холст? Почему он на один шире и выше, чем ожидалось?
  2. Это простое исправление - просто вычесть 1 из width и height при настройке холста, который должен иметь ширину width и высоту height?

1 Ответ

2 голосов
/ 29 октября 2019

Есть и другие вещи, которые влияют на общую ширину и высоту виджета, кроме атрибутов width и height. Например, и borderwidth, и highlightthickness влияют на общий размер виджета. Поскольку вы не устанавливаете их на ноль, вы полагаетесь на значения по умолчанию для вашей платформы, и эти значения по умолчанию, очевидно, не равны нулю.

Вам необходимо явно установить эти атрибуты на ноль:

canvas = tk.Canvas(root, width=100, height=100, highlightthickness=0, borderwidth=0)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...