Вот как минимум часть проблемы для приведенного вами примера. Прежде чем константы имени ключа IUP будут фактически определены в вашей таблице iup
, вам нужно вызвать функцию. Идея состоит в том, что объем памяти уменьшается, если вам не нужны все имена ключей, без чего многие приложения могут обойтись полностью.
Попробуйте добавить следующие строки вскоре после require "iuplua"
и перед тем, как использовать имена в любом коде:
iup.key_open() -- load key names
Это задокументировано в верхней части темы Коды клавиатуры , а также в различных местах, связанных с клавиатурой.
Без вызова iup.key_open()
, iup.K_q
оценивается как nil
(как и любое другое имя ключа) и, таким образом, молча никогда не совпадает ни с одним кодом ключа, переданным canvas:k_any()
.
Редактировать: Я только что проверил ваш пример, и действительно вызов iup.key_open()
приводит к распознаванию клавиш q и w. У вас есть еще один глюк, который вы заметите следующим: просто обновление положения весла не требует перерисовки холста. Я оставлю это как упражнение по мере вашего продвижения вперед.
Edit2: Добавление строки iup.Update(self)
к функции canvas:k_any()
сразу после изменения состояния весла, кажется, делает то, что вы хотите. Делая это таким образом, вместо ручного вызова метода action()
, вы получаете преимущество взаимодействия с обработкой цикла сообщений IUP ожидаемым образом. В общем случае вызов iup.UpdateChildren(window)
вместо этого может быть предпочтительным. Это позволит обновлять любые другие элементы управления IUP, отображаемые в диалоговом окне, а также холст, что может быть полезно, если у вас есть элементы управления, которые не выполняют все свои собственные обновления внутри.
Кроме того, вы можете переместить процедуры рисования в их собственную функцию, вызываемую из методов k_any()
и action()
холста. Я не уверен, что рекомендую делать это в общем случае, так как он не масштабируется, если вы хотите поддерживать несколько окон просмотра или связанных элементов управления.
Возможно, вы захотите изменить логику в вашем обработчике k_any()
, чтобы вы с меньшей вероятностью случайно забыли вызов iup.Update()
при добавлении дел для новых ключей.