Tkinter, использующий циклы для создания кнопок и записи в кнопки из размерного списка

#python #tkinter

#python #tkinter

Вопрос:

Я учусь использовать циклы в tkinter для создания кнопок и записи из двумерного списка в кнопки.

Мой первый вопрос заключается в том, что я хотел бы, чтобы две нижние кнопки (PressBtns) были названы button 1 и button 2 соответственно, не уверен, как это сделать при использовании циклов.

Мой второй запрос заключается в том, что при нажатии этих кнопок «Кнопка 1» печатает первую часть двумерного списка на (ShowBtns) ([«10», «20», «40», «80», «90», «100»]) по одному номеру на каждую кнопку и когдаПри нажатии кнопки 2 печатается вторая часть двумерного списка на (Showbtns)([«95», «90», «80», «40», «20», «10»]]) перезапись первого списка. Заранее спасибо за помощь, смотрите мой код ниже.

 import tkinter as tk

window = tk.Tk()

Lists=[["10", "20", "40",  "80", "90", "100"], 
["95", "90", "80", "40", "20", "10"]]

def List1():
    j= 6
    for row in (Lists):
        for col in row [0:j]:
            j=j-1
            PressBtns.config (text = col)
            

def List2():
    j= 6
    for row in (Lists):
        for col in row [1:j]:
            j=j-1
            PressBtns.config (text = col)
            

for i in range (6):
    ShowBtns = tk.Button (window, height = 1, width = 5)
    ShowBtns.grid (row = i, column = 5)

counter = 6
for i in range (len(Lists)):
    PressBtns = tk.Button (window, height = 1, width = 10, command = "")
    PressBtns.grid(row = counter, column = 5)
    counter = counter  1

window.mainloop()
        
 

Комментарии:

1. Для параметра command в вашей кнопке вам нужен способ передачи Lists[i] в качестве предварительно встроенного аргумента обратного вызова, который вы указываете в качестве значения. Я знаю два способа сделать это. Либо объявить a lambda , либо a functools частичным journaldev.com/33505/python-partial-function-functools-partial

2. @AndrewAllaire используя лямбду, вы не можете просто передать Lists[i] , как я указал в своем ответе, но с частичным вы можете, и это работает отлично. Это очень хороший совет. Единственное отличие заключается в том, что partial требует, чтобы вы определили функцию, прежде чем устанавливать ее в качестве функции обратного вызова кнопки.

Ответ №1:

для вашего первого вопроса вы можете назвать кнопки с опцией text . В вашем случае вы можете просто выполнить PressBtns = tk.Button (window, text="Button {}".format(i 1), height = 1, width = 10, command = "") внутри цикла for.

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

 ShowBtns = []
for i in range (6):
    ShowBtns.append(tk.Button (window, height = 1, width = 5))
    ShowBtns[-1].grid (row = i, column = 5)
 

Теперь мы можем создать функцию, которая получает список и изменяет текст каждой кнопки на номер в списке:

 def change_btText(names):
    for i in range(len(ShowBtns)):
        ShowBtns[i]["text"] = names[i]
        window.update()
 

последнее, что нужно сделать, это добавить эту функцию в качестве функции обратного вызова кнопок 1 и 2 при ее создании:

 for i in range (len(Lists)):
    PressBtns = tk.Button (window, text="Button {}".format(i 1), height = 1, width = 10, command = lambda x=i: change_btText(Lists[x]))
    PressBtns.grid(row = counter, column = 5)
    counter = counter  1
 

смотрите здесь, что вы не можете использовать Lists[i] , вы должны создать x=i , иначе обе кнопки будут использовать последнее значение i , а не значение при создании кнопки.