Tkinter: назначение привязок большому количеству виджетов (фреймов), созданных функцией цикла.Python

Программы на Python
Ответить
Anonymous
 Tkinter: назначение привязок большому количеству виджетов (фреймов), созданных функцией цикла.

Сообщение Anonymous »

Я разрабатываю инструмент отображения галереи с помощью Python Tkinter, который предполагает одновременное создание множества фреймов, каждый из которых содержит изображение. Это достигается с помощью циклов while или for:

Код: Выделить всё

x = 0
while x < 10:
tk.Frame(r, width=50, height=50, borderwidth=1, relief='solid', bg='purple').pack()
x+=1
Это работает хорошо, поскольку мне не нужно ничего хранить в переменной. Однако проблема в том, что я также хочу привязать событие к каждому из этих фреймов, что не работает должным образом:

Код: Выделить всё

import tkinter as tk

r = tk.Tk()

# This function switches the Frame's color
def change_color(wid):
# This print function shows that only '.!Frame10' is being affected
print(wid)

if wid['bg'] == 'purple':
wid['bg'] = 'green'

elif wid['bg'] == 'green':
wid['bg'] = 'purple'

# Frames are created by functions to allow binding & packing using a temporary reference
def frame():
main = tk.Frame(r, width=50, height=50, borderwidth=1, relief='solid', bg='purple')
# This bind triggers the function which affects the frame being left-clicked
main.bind_all('', lambda a: change_color(main) )
main.pack()

# This loop creates 10 instances of the frame
x = 0
while x < 10:
frame()
x+=1

r.mainloop()
Предполагаемый результат заключается в том, что каждый отдельный кадр можно щелкнуть левой кнопкой мыши, чтобы переключить его цвет, но вместо этого только последний кадр, получивший название «.!Frame10», переключает цвет, если щелкнуть любой из кадров. .
Я читал, что можно автоматизировать сохранение объектов/функций в переменных с помощью словарей, но у меня это не работает. Этот пример, который я сделал, возвращает " KeyError: '3' ", который я не понимаю.

Код: Выделить всё

import tkinter as tk

r = tk.Tk()

# This function switches the Frame's color
def change_color(x):
# This print function shows that only '.!Frame10' is being affected
print(x)

if x['bg'] == 'purple':
x['bg'] = 'green'

elif x['bg'] == 'green':
x['bg'] = 'purple'

dic = {}

# This loop creates frames and stores them in the dictionary above.
x = 1
while x < 3:
dic[str(x)] = tk.Frame(r, width=50, height=50, borderwidth=1, relief='solid', bg='purple')
dic[str(x)].bind_all('', lambda a: change_color(dic[str(x)]) )
dic[str(x)].pack()
x+=1

r.mainloop()
Я несколько раз заставлял его работать со словарями, но результат был тот же, что и выше; изменяется только последний кадр.
Будем благодарны за любую помощь.

Подробнее здесь: https://stackoverflow.com/questions/792 ... -by-a-loop
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»