Это распространенная проблема в Python, связанная с замыканием (closure) в циклах. Когда вы используете переменную цикла в функции, эта переменная сохраняет последнее значение после завершения цикла.
В вашем случае, если вы передаете индекс в обработчик события кнопки, который создается в цикле, все кнопки будут ссылаться на одну и ту же переменную, которая в момент нажатия кнопки будет иметь последнее значение.
Чтобы решить эту проблему, вы можете использовать аргумент по умолчанию в функции, чтобы зафиксировать текущее значение переменной:
```python
import pystray
from pystray import MenuItem as item
def set_device(index):
print(f'Selected device index: {index}')
# Список индексов ваших устройств
device_indices = [4, 5, 6]
# Создайте список кнопок для вашего меню
menu_items = [
item(f'Device {index}', lambda _, idx=index: set_device(idx)) for index in device_indices
]
# Создайте и запустите иконку
icon = pystray.Icon('test_icon', menu=pystray.Menu(*menu_items))
icon.run()
```
В этом примере мы используем `lambda` с параметром `idx=index`. Это создает новую переменную `idx` для каждой кнопки, которая сохраняет текущее значение `index` на момент создания кнопки. Таким образом, даже если цикл завершится, каждая функция-обработчик будет иметь доступ к своему собственному значению индекса.