Создание модального диалога с помощью Ruby / Tk - PullRequest
1 голос
/ 20 марта 2012

У меня есть следующий код:

  dialogproc = proc {
    if (tree.focus_item)
      per = Person.get(tree.focus_item)
      dialog = persondialog(per, root)
      dialog.set_focus()
      dialog.grab()
      dialog.transient(root)
      per.save
    end
  }

В persondialog я создаю TkToplevel.Я хочу, чтобы он был модальным в том виде, в котором я привык к нему с помощью наборов инструментов, таких как Borlands OWL, где контроль передается диалогу, и человек будет сохранен после закрытия диалога.В моем примере сохранение вызывается в тот же момент, когда отображается диалоговое окно.

За исключением того, что диалог довольно модальный (вы можете взаимодействовать с границей окна, но для меня это не проблема).Я сделал несколько диких тестов с tkwait (довольно недокументированным для пользователей ruby), но безуспешно.Либо это не сработало вообще, либо появилось несколько странных сообщений об ошибках tk, которые не указывали на полезное направление.

Я не уверен, что я иду в правильном направлении.Я мог бы, вероятно, решить мою проблему, предоставив proc в persondialog, который вызывается, когда вызывается кнопка «Сохранить» и при желании сохраняет человека или делает что-то еще.

Или необходимо наследование класса от TopLevel?

Как ваши советы для лучшего решения.Я хочу, чтобы диалог вносил изменения только в модель, но не в базу данных.Это должно быть сделано как-то независимо.Спасибо.

Ответы [ 2 ]

1 голос
/ 27 марта 2012

Вы можете установить захват только в том окне, которое действительно существует на экране. Попробуйте подождать, пока после того, как событие <Map> или <Expose> (доступное только для уровня сценария в Tk 8.5 и выше) будет доставлено в окно (или, что еще лучше, событие <Visibility>, хотя они поддерживаются только при рендеринге через X11).

Это потребует от вас разделения вашего кода на несколько частей, причем некоторые из них будут выполняться в обработчике событий; если вы хотите, чтобы код вел себя как синхронный вызов (с точки зрения «снаружи»), то вам нужно использовать какой-то механизм ожидания события. Это то, что делает tkwait, но я не знаю достаточно о связи Ruby с Tk, чтобы дать совет о том, как заставить это работать. Если вы можете заставить свой API работать, вызывая обратный вызов, как только ответ придет из вашего диалога, это будет намного проще интегрировать, так как в любом случае так работает Tk.

0 голосов
/ 26 марта 2019

Я хочу, чтобы он был модальным

управление предоставляется диалогу [,], и человек будет сохранен после закрытия диалога

Возможно, что,если модальный диалог чрезвычайно прост, вы можете использовать Tk.messageBox.Автоматически это модальное окно, и оно получает контроль.Вы также можете вызвать целую серию Tk.messageBox и получить ответы человека на длинный список вопросов «да» или «нет».Для получения информации перейдите к Стандартные диалоги (в учебном пособии по TkDocs) и выделите раздел Диалоги предупреждений и подтверждений.

Если вам нужно модальное окно, которое носит более общий характер, TkToplevel действительно правильный подход.См. Раздел Создание и уничтожение Windows в учебном пособии.

Возможно, я мог бы решить свою проблему, передав процедуру в persondialog, который вызывается при вызове кнопки сохранения [,] и при желании спасает человека или делает что-то еще

Совершенно верно.

Я провел несколько диких тестов с tkwait

OfКонечно, tkwait включает в себя темы.Вместо этого, почему бы просто не позволить людям щелкнуть немодальное окно, если они хотят?

...