Создайте изображение, состоящее из блоков в 2-х цветах, используя python - PullRequest
1 голос
/ 30 апреля 2019

У меня есть массив

arr = [[1,0,0,1], 
       [1,1,1,1], 
       [1,1,1,0]]

Я хочу создать изображение, которое создает зеленую рамку, где есть 1, и красную рамку, где есть 0

PS Я делаюне хочу делать сюжет, но изображение.

Используя Tkinter, я получаю все поля в одной строке, но мне нужно, чтобы они были расположены в строках и столбцах, как в 2D-массиве.В моем коде я не могу понять, как перейти к новой строке после печати полей, соответствующих строке

import tkinter as tk

root = tk.Tk()
arr = [[1,0,0,1], [1,1,1,1], [1,1,1,0]]
for i in range(len(arr)):
    for j in range(len(arr[i])):
        if arr[i][j]==0:
            w = tk.Label(root, text="red", bg="red", fg="white")
            w.pack(padx=5, pady=10)
        elif arr[i][j]==1:
            w = tk.Label(root, text="green", bg="green", fg="black")
            w.pack(padx=5, pady=20)
        w.pack(side=tk.LEFT)
    # need something here to move to a new line after printing each row
tk.mainloop()

Текущий вывод: enter image description here

Ответы [ 3 ]

2 голосов
/ 30 апреля 2019

Вы должны использовать .grid() менеджер раскладки

for i in range(len(arr)): #rows in arr
    for j in range(len(arr[i])): #cols in that row
        if arr[i][j]==0:
            w = tk.Label(root, text="red", bg="red", fg="white")
        elif arr[i][j]==1:
            w = tk.Label(root, text="green", bg="green", fg="black")
        w.grid(row = i, col = j)

Это помещает вашу метку в "2-мерную таблицу", состоящую из строк и столбцов.
Существует также padxи pady для заполнения
Прокомментируйте, если что-то можно улучшить.

1 голос
/ 30 апреля 2019

Используйте grid() макет вместо pack(), вы также можете использовать place() макет, но в этом вам придется проделать большую работу. Также размер меток будет отличаться и не будет заполнять всю ячейку сетки, для этого используйте sticky = 'nsew', это растянет Label, чтобы заполнить ячейку.

Вот код

Я использовал enumerate() функцию, она возвращает индекс массива.

Если вы хотите иметь все объекты меток, вы можете создать список или словарь для доступа к каждому из них в отдельности. Например, создайте list в начале и выполните list.append(L) в цикле для каждого Label для дальнейшего использования.

import tkinter as tk

arr = [[1,0,0,1], 
       [1,1,1,1], 
       [1,1,1,0]]

root = tk.Tk()

for row , ar in enumerate(arr):
    for col, color in enumerate(ar):
        bg = 'green' if color else 'red'
        fg = 'black' if color else 'white'
        L = tk.Label(root, text=bg, bg=bg, fg=fg)
        L.grid(row=row, column=col, sticky='nswe')

root.mainloop()

Выход:

Output

1 голос
/ 30 апреля 2019

Сетка Tkinter () Метод:

Менеджер геометрии сетки размещает виджеты в двухмерной таблице. Главный виджет разбит на несколько строк и столбцов, и каждый «Ячейка» в результирующей таблице может содержать виджет.

используйте метод сетки, чтобы сообщить менеджеру, в какую строку и столбец их поместить. Вам не нужно заранее указывать размер сетки; менеджер автоматически определяет это из виджетов в нем.

root = tk.Tk()
arr = [[1,0,0,1], [1,1,1,1], [1,1,1,0]]
for i in range(len(arr)):
    for j in range(len(arr[i])):
        if arr[i][j]==0:
            w = tk.Label(root, text="red", bg="red", fg="white").grid(row=i, column=j)
        elif arr[i][j]==1:
            w = tk.Label(root, text="green", bg="green", fg="black").grid(row=i, column=j)
tk.mainloop()

результат:

enter image description here

Обратите внимание, что виджеты центрированы в своих ячейках. Вы можете использовать sticky возможность изменить это; эта опция принимает одно или несколько значений из набора N, S, E, W.

пример: чтобы выровнять метки по левой границе, вы можете использовать W (запад)

в вашем случае:

w = tk.Label(root, text="red", bg="red", fg="white").grid(row=i, column=j, sticky=(W, E))

результат:

enter image description here

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