Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/290.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 网格中的tkinter画布具有额外空间_Python_Canvas_Grid_Tkinter_Tk - Fatal编程技术网

Python 网格中的tkinter画布具有额外空间

Python 网格中的tkinter画布具有额外空间,python,canvas,grid,tkinter,tk,Python,Canvas,Grid,Tkinter,Tk,我在一个框架内有一块画布,我说过画布应该是250x250。但由于某些原因,它被创造得更大,在右边和底部有额外的空间。这是我的密码。。。有什么想法吗 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','

我在一个框架内有一块画布,我说过画布应该是250x250。但由于某些原因,它被创造得更大,在右边和底部有额外的空间。这是我的密码。。。有什么想法吗

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()
结果是:

我宁愿在画完较小的正方形后,避免画布右侧和底部的白色排水沟

我做了以下更改:

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

它将正确绘制。您可以看到灰色边界线在所有4条边上都是正确的:


画布有一个边框,由
borderwidth
属性控制。它还有另一个由
highlightthickness
属性控制的边框。将这两个值都设置为零,画布的大小应与设置的大小完全相同


border
属性通常用于提供3D效果——凸起的边框、凹陷的边框或其他一些变体。
highlightthickness
(和
highlightcolor
)属性定义了一个实心轮廓,用于表示小部件具有键盘焦点

有了这个答案,我意识到左上角的正方形是用我的原始代码在左上角画出来的。这就是我不明白的,还有为什么会有阴沟。但仍然不确定为什么249比250好……这个答案并不能解释为什么画布的大小不合适,它只是提供了一个解决办法。@Bryan:是的,我能够让它工作,但不确定为什么。我对你的答案投了赞成票,因为它解释了原因。一个非常有启发性的答案!谢谢,如果没有边框,电路板看起来确实干净多了,而且几何图形实际上也很有意义。在我看来,画布坐标不应该包括边界。。。世界上为什么0,0会在可视区域之外,在边界上?@ChrisIrwin:我不知道。我总是觉得奇怪,0,0在边界上。几十年来一直如此,tk开发人员很少做出向后不兼容的更改。
top = row * self.sqsize +2
left = col * self.sqsize +2
bottom = row * self.sqsize + self.sqsize
right = col * self.sqsize + self.sqsize