2013-04-09 4 views
2

У меня есть холст внутри рамки, и я сказал, что холст должен быть 250x250. Но по какой-то причине он создается больше, с дополнительным пространством справа и снизу. Вот мой код ... любые идеи?tkinter canvas в сетке имеет дополнительное пространство

from tkinter import * 
from tkinter import ttk 
from player import player0 

alpha = ('A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z') 

class GUI(Frame): 

    def __init__(self, master): 
     Frame.__init__(self, master) 
     self.boardsize = 250 
     self.sqsize = self.boardsize//5 
     master.title("Canvas with extra space") 
     self.initialdraw() 
     self.grid(row=0,column=0) 

    def initialdraw(self): 
     mainframe = ttk.Frame(self, padding=(5,5,5,5)) 
     mainframe.grid(column=0, row=0, sticky=(N, S, E, W)) 

     self.board = Canvas(mainframe, width=self.boardsize, height=self.boardsize,bg='white') 
     self.board.grid(row=1,column=0) 

     for row in range(5): 
      for col in range(5): 
       top = row * self.sqsize 
       left = col * self.sqsize 
       bottom = row * self.sqsize + self.sqsize -2 
       right = col * self.sqsize + self.sqsize -2 
       rect = self.board.create_rectangle(left,top,right,bottom,outline='gray',fill='') 

     self.board.focus_set() 

if __name__ == '__main__': 
    tk = Tk() 
    gui = GUI(tk) 
    tk.mainloop() 

Результат таков:

canvas with extra space

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

ответ

4

Полотно имеет границу, управляемый с помощью атрибута borderwidth. Он также имеет другую границу, контролируемую атрибутом highlightthickness. Установите оба из них в ноль, и ваш холст должен быть точно того размера, который вы его установили.

Атрибут border обычно используется для обеспечения 3D-эффекта - поднятой границы, затонувшего борта или пары других вариантов. Атрибуты highlightthicknesshighlightcolor) определяют сплошную схему, используемую для обозначения того, что виджет имеет фокус клавиатуры.

+1

Очень поучительный ответ! Спасибо, доска выглядит намного чище без границ, и геометрия действительно имеет смысл. Мне кажется, что координаты Canvas не должны включать границу ... почему в мире было бы 0,0 за пределами видимой области, на границе? –

+1

@ChrisIrwin: Я не знаю. Мне всегда было странно, что 0,0 был на границе. Так было в течение пары десятилетий, и разработчики tk редко делают обратные-несовместимые изменения. –

0

Я сделал эти изменения:

self.boardsize = 249 
self.sqsize = 50#self.boardsize//5 

и

top = row * self.sqsize +2 
left = col * self.sqsize +2 
bottom = row * self.sqsize + self.sqsize 
right = col * self.sqsize + self.sqsize 

Он будет рисовать правильно. Вы можете видеть, что серые пограничные линии являются правильными на всех 4-х сторон:

enter image description here

+0

С этим ответом я понимаю, что верхний левый квадрат - это своего рода вытягивание из верхнего левого края с моим исходным кодом. Это то, чего я не понимал, и почему существовал желоб. Все еще не уверен, почему 249 лучше, чем 250, хотя ... –

+0

Этот ответ не объясняет, почему холст не соответствует размеру, он просто обеспечивает обходной путь. –

+0

@Bryan: Правда, я смог заставить его работать, но не был уверен, почему. Я поддержал ваш ответ, потому что он объясняет причину. – twasbrillig

Смежные вопросы