Проблема заполнения Python Tkinter - PullRequest
5 голосов
/ 10 января 2011

Я изучаю Tkinter и создаю простую игру-головоломку 8.
(Пример: http://www.permadi.com/java/puzzle8/)

Каждое число - это объект Canvas, помещенный в фрейм с использованием компоновки сетки. Один из объектов:добавление дополнительного отступа между объектами Canvas. Я установил ширину границы для объектов Canvas на -2, что решило проблему некоторых людей, но это немного уменьшило дополнительные отступы для меня. Установка этого значения на -4 начинает врезаться в мою область холста.

Я предполагаю, что ячейки компоновки сетки имеют некоторый отступ по умолчанию или ширину границы, но я не нашел способа удалить его. Установка значений padx, pady, ipadx, ipady при вызове grid () наПохоже, что объекты Canvas тоже не помогают.

Еще одна странность, которую я обнаружил, была при создании границы для моих объектов 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 Ответ

9 голосов
/ 10 января 2011

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

Вот хитрость при попытке решить эти типы проблем с макетом: назначьте каждому виджету свой цвет фона (то есть: цвет корневого окна, цвет ваших внутренних рамок, цвет холста). Затем вы можете использовать цвета в качестве руководства, чтобы увидеть, какому виджету принадлежит пространство, которое вы пытаетесь устранить.

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