Использование циклов for для создания сетки виджетов в tkinter - PullRequest
0 голосов
/ 25 мая 2018

Я пытаюсь сократить количество кода, необходимого для создания сетки кнопок 4x4 в простом приложении калькулятора с использованием tkinter и python 3.6. До сих пор я создал сетку, используя отдельный список и цикл for для каждой строки.кнопок, как показано ниже

    firstRow = ['1','2','3',] 
    secondRow = ['4','5','6','*']
    thirdRow = ['7','8','9','/']
    forthRow = ['.','0','-','+']


    for b in range(len(firstRow)):
        firstBtns = tk.Button(self, text=firstRow[b],
                              command=lambda i=firstRow[b]: entry.insert('end',i),
                              width=5)
        firstBtns.grid(row=0, column=b)

    for b in range(len(secondRow)):
        secondBtns = tk.Button(self, text=secondRow[b], width=5)
        secondBtns.grid(row=1, column=b)

    for b in range(len(thirdRow)):
        thirdBtns = tk.Button(self, text=thirdRow[b], width=5)
        thirdBtns.grid(row=2, column=b)

    for b in range(len(forthRow)):
        forthBtns = tk.Button(self, text=forthRow[b], width=5)
        forthBtns.grid(row=3, column=b)

Мне интересно, есть ли способ сделать это с помощью 4 списков в списке и с помощью одного цикла for или вложенного цикла for?вот что я пробовал, но не могу заставить его отображаться правильно.

buttonRows = [['1','2','3','AC'],['4','5','6','/'],
                ['7','8','9','*',],['.','0','-','+']] 

    for lst in range(len(buttonRows)):

        for b in buttonRows[lst]:          
            print(len(buttonRows[lst]))
            btns = tk.Button(self, text=b, width=5)
            btns.grid(row=lst, column=lst)

вот что он мне дает введите описание изображения здесь

1 Ответ

0 голосов
/ 25 мая 2018

Вы размещаете все кнопки в каждой строке в одной строке и столбце: btns.grid(row=lst, column=lst).

Более Pythonic и легче читать код, если вы перебираете списки и используете перечисление:

import tkinter as tk

root = tk.Tk()

buttonRows = [['1','2','3','AC'],['4','5','6','/'],
              ['7','8','9','*',],['.','0','-','+']] 

for row_index, row in enumerate(buttonRows):
    for cell_index, cell in enumerate(row):
        btns = tk.Button(root, text=cell, width=5)
        btns.grid(row=row_index, column=cell_index)
...