Привязать к холсту виджета в tkinter [duplicate]

Чтобы вставить мои два цента ...

Используя тип списка для источника, который должен быть помечен, я нашел еще одно очень компактное решение:

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;
}
9
задан Robert Bean 7 March 2013 в 13:13
поделиться

3 ответа

Связывание клавиш срабатывает только тогда, когда виджет с фокусом клавиатуры получает ключевое событие. По умолчанию холст не получает фокус клавиатуры. Вы можете сосредоточить его на методе focus_set. Обычно вы делаете это в привязке на кнопке мыши.

Добавьте следующую привязку к вашему коду, затем нажмите на холсте, и ваши привязки клавиш начнут работать:

w.bind("<1>", lambda event: w.focus_set())
11
ответ дан Bryan Oakley 22 August 2018 в 04:45
поделиться
  • 1
    Спасибо Брайан, это проблема фокуса. Хотя код немного отличается. Я заставляю его работать inline `w.focus_set () w.bind ('& lt; Key & gt;', function)` – Robert Bean 8 March 2013 в 10:27
  • 2
    @RobertBean: просто, чтобы это было ясно - вам не нужно делать focus_set перед привязками. Перед тем, как люди начнут использовать клавиатуру, нужно сделать focus_set. – Bryan Oakley 8 March 2013 в 13:59
  • 3
    Я также не понимаю, почему @BryanOakley подчеркивает привязку мыши с помощью w.focus_set () вместо использования встроенного w.focus_set (). – wsysuper 14 May 2015 в 04:08
  • 4
    @wsysuper: Я не подчеркивал , я просто сказал, что это типично. Вы можете это сделать. В основном это зависит от того, есть ли у вас другие виджеты в пользовательском интерфейсе, которые могут сфокусироваться. Если вы это сделаете, вы, вероятно, захотите установить привязку, чтобы пользователь мог переключить фокус после того, как холст потерял фокус из-за того, что он щелкнул в другом настраиваемом виджетах. – Bryan Oakley 14 May 2015 в 09:14

Чтобы избежать «нажатия на холст, чтобы активировать привязки клавиш», я нашел более простой код на следующем сайте:

http://ubuntuforums.org/showthread.php?t = 1378609

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

w.focus_set()
w.bind(<Key>, callback)
3
ответ дан Donald 22 August 2018 в 04:45
поделиться

В tkinter есть удобное событие, называемое «Enter», которое отслеживает, когда мышь входит в виджет. Если вы привязываете его к холсту, а в обратном вызове привязки для этого события вы можете canvas.focus_set, то всякий раз, когда мышь находится на холсте, у вас будет фокус, и, таким образом, привязки клавиш будут работать.

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

1
ответ дан Velizar Zaharinov 22 August 2018 в 04:45
поделиться
  • 1
    Этот ответ был бы более полным с фрагментом кода. – Evan Weissburg 25 December 2017 в 20:57
Другие вопросы по тегам:

Похожие вопросы: