Чтобы вставить мои два цента ...
Используя тип списка для источника, который должен быть помечен, я нашел еще одно очень компактное решение:
public static IEnumerable<IEnumerable<TSource>> Chunk<TSource>(this IEnumerable<TSource> source, int chunkSize)
{
// copy the source into a list
var chunkList = source.ToList();
// return chunks of 'chunkSize' items
while (chunkList.Count > chunkSize)
{
yield return chunkList.GetRange(0, chunkSize);
chunkList.RemoveRange(0, chunkSize);
}
// return the rest
yield return chunkList;
}
Связывание клавиш срабатывает только тогда, когда виджет с фокусом клавиатуры получает ключевое событие. По умолчанию холст не получает фокус клавиатуры. Вы можете сосредоточить его на методе focus_set
. Обычно вы делаете это в привязке на кнопке мыши.
Добавьте следующую привязку к вашему коду, затем нажмите на холсте, и ваши привязки клавиш начнут работать:
w.bind("<1>", lambda event: w.focus_set())
Чтобы избежать «нажатия на холст, чтобы активировать привязки клавиш», я нашел более простой код на следующем сайте:
http://ubuntuforums.org/showthread.php?t = 1378609
Он пытается связать фрейм, но я реализовал его в своем собственном коде, и виджет холста также работает. Ваш код будет выглядеть следующим образом:
w.focus_set()
w.bind(<Key>, callback)
В tkinter есть удобное событие, называемое «Enter», которое отслеживает, когда мышь входит в виджет. Если вы привязываете его к холсту, а в обратном вызове привязки для этого события вы можете canvas.focus_set, то всякий раз, когда мышь находится на холсте, у вас будет фокус, и, таким образом, привязки клавиш будут работать.
будет работать, даже если холст теряет фокус (скажем, введя текст в другой виджет), потому что, когда мышь снова войдет в холст, он восстановит фокус.