使用Ruby / Tk创建模态对话框

问题描述 投票:1回答:2

我有以下代码:

  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这样的Toolkits以我习惯的方式进行模态化,其中控件被赋予对话框,并且在对话框关闭后将保存人员。在我的示例中,在显示对话框的同一时刻调用save。

除了那个对话框是非常模态的(你可以与窗口边界交互,但对我来说这没问题)。我已经使用tkwait进行了一些疯狂的测试(对于ruby用户来说相当没有文档)但没有成功。要么它根本不起作用,要么它提出了一些奇怪的tk错误消息,这些消息没有指向有用的方向。

我不确定我是否朝着正确的方向前进。我可以通过在persondialog中提供一个proc来解决我的问题,当调用保存按钮时调用它,如果需要,可以保存此人或执行其他操作。

或者从TopLevel继承一个必要的类?

您对最佳解决方案的建议如何?我希望对话框只对模型进行更改,而不是对数据库进行更改。这应该以某种方式独立完成。谢谢。

ruby dialog modal-dialog tk
2个回答
1
投票

您只能在屏幕上实际存在的窗口上设置抓取。尝试等待,直到<Map><Expose>事件(仅暴露到Tk 8.5中的脚本级别)已经被传递到窗口(或者更好的是<Visibility>事件,尽管它们仅在通过X11渲染时得到支持)。

这将要求您将代码分成几个部分,其中一些部分在事件处理程序中;如果您希望代码的行为类似于同步调用(从“外部”的角度来看),那么您需要使用某种等待事件机制。这就是tkwait所做的,但我不太了解Ruby与Tk的耦合,以提供有关如何使其工作的建议。如果您可以通过在对话响应时调用回调来使API工作,那么集成就更容易了,因为无论如何Tk在内部工作。


0
投票

我希望它是模态的

控件被赋予对话框[,],对话框关闭后将保存人员

如果模态对话框非常简单,你可以使用Tk.messageBox。自动这是一个模态窗口,并获得控制权。你也可以调用一系列Tk.messageBoxes,从而获得一个人对一长串是或否问题的答案。有关信息,请转到Standard Dialogs(在TkDocs教程中)并滚动到“警报和确认对话框”部分。

如果你需要一个更通用的模态窗口,TkToplevel确实是正确的方法。请参阅教程中的Creating and Destroying Windows部分。

我可以通过在persondialog中提供一个proc来解决我的问题,当调用保存按钮时调用[,]并且如果需要可以保存人或做其他事情

非常正确。

我用tkwait做了一些疯狂的测试

当然,tkwait涉及线程。相反,为什么不让人们点击非模态窗口,如果他们想要?

© www.soinside.com 2019 - 2024. All rights reserved.