使用python创建由2种颜色的框组成的图像

时间:2019-04-30 14:15:31

标签: python arrays user-interface tkinter

我有一个数组

function changeCountry(countryName) {

    let clickedContry = document.getElementById(countryName);
    let totalCountries = document.getElementsByClassName("country");

    if(clickedContry.classList.contains("countryActive")) {
        for (let i = 0; i < totalCountries.length; i++) {
            if (totalCountries[i].classList.contains("countryInactive")) {
                totalCountries[i].classList.replace("countryInactive", "countryActive");
            }
        }
    } else {
        // Remove class countryActive from previous selection
        clickedContry.classList.add("countryActive");
    }
}

我想创建一个图像,使绿色框为1,红色框为0

P.S。我不想作图,但要作图。

使用Tkinter,我将所有盒子都放在一行中,但是我需要像2D数组中那样将它们排列成行和列。 在我的代码中,打印出与一行相对应的框后,我无法确定如何移动到新行

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

电流输出: enter image description here

3 个答案:

答案 0 :(得分:2)

您应该使用.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)

这会将标签放置在由行和列组成的“二维表”中。
还有padxpady用于填充
注释,如果可以改进的话。

答案 1 :(得分:1)

  

Tkinter grid()方法:

     

网格几何管理器将小部件放在二维表中。   主窗口小部件分为许多行和列,每个   结果表中的“单元格”可以容纳一个小部件。

使用grid方法告诉管理器将它们放置在哪一行和哪一列中。您不必预先指定网格的大小;管理器会根据其中的小部件自动确定。

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

  

请注意,小部件位于其单元格的中心。   粘性选项可更改此设置;此选项从集合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

答案 2 :(得分:1)

使用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