Python Tkinter 填充问题

6 投票
1 回答
4781 浏览
提问于 2025-04-16 09:42

我正在学习Tkinter,并且在制作一个简单的8拼图游戏。
(示例链接:http://www.permadi.com/java/puzzle8/

每个数字都是一个Canvas对象,放在一个Frame里,使用网格布局。可是,有一个对象在Canvas对象之间加了额外的间距。我把Canvas对象的边框宽度设置为-2,这解决了一些人的问题,但对我来说,只是稍微减少了一点额外的间距。如果把这个值设置为-4,就会侵占到我的画布区域了。

我猜测网格布局的单元格有一些默认的间距或边框宽度,但我还没有找到去除它的方法。在调用Canvas对象的grid()时设置padx、pady、ipadx、ipady这些值似乎也没有帮助。

还有一个奇怪的地方是,当我为Canvas对象创建边框时,我使用了create_rectangle,但我必须把x_1和y_1的起始点设置为4,4,而不是我预期的0,0或2,2,这样才能形成一个2像素的边框。

这是我的代码。任何帮助、建议、解决方法等都非常感谢。

#!/usr/bin/python

from Tkinter import *

class Number(Canvas):
    def __init__(self, master=None, number=1):
        Canvas.__init__(self, master, width=100, height=100, bd=-2)
        self.create_text(50, 50, text=str(number), anchor=CENTER)
        self.create_rectangle(4, 4, 98, 98, width=2)


class Application(Frame):
    def create_widgets(self):
        self.playarea = Frame(self, width=300, height=300)
        self.playarea.grid_propagate(0)
        self.playarea.grid()
        self.playarea.numbers = []
        for number in xrange(1, 10):
            num_obj = Number(self.playarea, number)
            self.playarea.numbers.append(num_obj)
            row = number // 3
            col = number % 3
            num_obj.grid(row=row, column=col)

    def __init__(self, master=None):
        Frame.__init__(self, master)
        self.grid()
        self.create_widgets()


def main():
    app = Application()
    app.master.title("Sample Application")
    app.mainloop()

if __name__ == '__main__':
    main()

1 个回答

10

你遇到的问题很可能是因为你没有把每个画布的 highlightthickness 属性设置为零。这个值控制着小部件周围的彩色边框,用来表示它当前是被选中的状态。

这里有个小技巧,可以帮助你解决这类布局问题:给每个小部件设置不同的背景颜色(比如:根窗口一个颜色,内部框架一个颜色,画布一个颜色)。这样你就可以通过颜色来判断哪个小部件占用了你想要去掉的空间。

撰写回答