#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]
в качестве предварительно встроенного аргумента обратного вызова, который вы указываете в качестве значения. Я знаю два способа сделать это. Либо объявить alambda
, либо a functools частичным journaldev.com/33505/python-partial-function-functools-partial2. @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
, а не значение при создании кнопки.