Python Tkinter 填充问题
我正在学习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
属性设置为零。这个值控制着小部件周围的彩色边框,用来表示它当前是被选中的状态。
这里有个小技巧,可以帮助你解决这类布局问题:给每个小部件设置不同的背景颜色(比如:根窗口一个颜色,内部框架一个颜色,画布一个颜色)。这样你就可以通过颜色来判断哪个小部件占用了你想要去掉的空间。