tkinter >> как получить ссылки на кнопки?

В настоящее время я пытаюсь создать игру с линкором с Python и tkinter. Мне нужно объявить 100 кнопок (по одному для каждого пятна, на котором может запускаться проигрыватель), и я понял, что могу сделать это, чтобы получить их в сетке 10×10, а также сохранить ссылку на них с помощью переменной buttons_dict

from tkinter import * from tkinter import ttk root = Tk() board_frame = ttk.Frame(root, padding=5) board_frame.grid(column=0,row=0) COORDS_LIST = [] buttons_dict = {} for r in range(1,11): for c in range(1,11): coord = str(r)+"_"+str(c) COORDS_LIST.append(coord) buttons_dict[COORDS_LIST[-1]] = ttk.Button(board_frame, text="O", width="2") buttons_dict[COORDS_LIST[-1]].grid(row=r,column=c) root.mainloop() 

Этот код создает 100 кнопок, отображаемых точно так, как мне нужно. Проблема начинается, когда я хочу дать команду каждому из них. Я бы хотел, чтобы это была общая функция (мы можем назвать это «fire_here» для этого вопроса), которая вызывается каждый раз, когда нажимается одна из кнопок, но мне нужно, чтобы она передавалась либо 1, либо 2 аргументами: это может быть значение который был добавлен в COORDS_LIST, когда эта кнопка была создана, или это могут быть значения столбца и строки. Итак, как мне это сделать ИЛИ как я могу получить строку / столбец одной кнопки после ее размещения?

One Solution collect form web for “tkinter >> как получить ссылки на кнопки?”

Я думаю, вам нужно что-то вроде этого:

 from tkinter import * from tkinter import ttk root = Tk() board_frame = ttk.Frame(root, padding=5) board_frame.grid(column=0,row=0) COORDS_LIST = [] buttons_dict = {} ########################################### def fire_here(x, y): print("column:{}, row:{}".format(x, y)) ########################################### for r in range(1,11): for c in range(1,11): coord = str(r)+"_"+str(c) COORDS_LIST.append(coord) buttons_dict[COORDS_LIST[-1]] = ttk.Button(board_frame, text="O", width="2") ########################################################################### buttons_dict[COORDS_LIST[-1]]["command"] = lambda x=c, y=r: fire_here(x, y) ########################################################################### buttons_dict[COORDS_LIST[-1]].grid(row=r,column=c) root.mainloop() 

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

 buttons_dict[COORDS_LIST[-1]]["command"] = lambda x=c, y=r: fire_here(x, y) 

В принципе, он выполняет две функции:

  1. Используя lambda , он создает функцию для опции command текущей кнопки. Эта функция будет вызываться при нажатии кнопки.

  2. Он принимает текущий столбец и строку (координаты кнопки в сетке) и устанавливает их как значения по умолчанию для параметров x и y функции. Более того, когда функция вызывается, эти значения будут отправляться в fire_here для обработки.


Кроме того, вы можете поместить это на строку выше:

 buttons_dict[COORDS_LIST[-1]] = ttk.Button(board_frame, text="O", width="2", command=lambda x=c, y=r: fire_here(x, y)) 

Тем не менее, я поставил его на своей собственной линии, чтобы улучшить четкость кода.

  • Tkinter Покажите экран заставки и скройте главный экран до тех пор, пока __init__ не закончит
  • NoneType Ошибка self.widget.insert
  • прокрутка python tkinter и проблемы с виджетами
  • записи получают данные из выбора combobox с использованием tkinter и python
  • «После» цикл бесконечно: никогда не заходите в mainloop
  • заставляйте кнопку открывать только одно окно за раз (включите кнопку, закрыв окно Toplevel)
  • простая графика для python
  • Как вставить этот код matplotlib в холст tkinter?
  • Создайте новый виджет ttk от tkinter
  • Как установить порядок вкладок в приложении tkinter?
  • Как удалить виджеты Tkinter из окна?
  • Python - лучший язык программирования в мире.