如何在Tk窗口/框架中嵌入一个应用程序?

3

如果可以将应用程序嵌入到Tk窗口中,您能否指导我正确的方法?

我正在尝试类似于:firefox -P "ToolTest" -no-remote -new-instance -private -kiosk -url "http://127.0.0.11:8000/study" 打开浏览器到本地服务器URL。

我读到了关于框架的-container选项和Entice论文,它使用TkXext获取窗口ID并重新父化它。然而,TkXext不在Tclib中,我不清楚它是否仍在使用以及它适用于哪些平台。

使用Tkinter似乎很容易做到这一点,至少根据这个geeks for geeks example;但我只使用Tcl/Tk。

谢谢。

1个回答

1

有两个关键步骤:

  1. 你应该使用 -container 1 -background {} 来制作 frame。这样可以准备 Tk 处理其他应用程序所做的操作,并禁用绘制背景。

  2. 你可以使用 winfo id $theFrame 获取框架的 XID,然后让另一个程序将其用作其主绘图表面。XID 将是 C 级别上的 Window ID。

    如果这是 Tk,则可以在创建时将 -use $id 选项用于 toplevel(在启动它时作为 wish 的参数,用于 .)。其他应用程序具有自己的机制;请查阅其文档(或找到适当的 Stack Overflow 回答)。

请注意,在 Windows 和 macOS 上,除非在两个 Tk 实例之间进行,否则不太可能使其工作。它们以不同的方式处理绘图表面 ID。


在Windows下,您可能需要使用winfo_frame并使用类似Python中的int(TheFrame.winfo_frame(), 16)的方法来获取十六进制值。 - Thingamabobs
谢谢。我认为这个SO问题及其关于嵌入的链接到一个维基Tcl页面非常类似于您概述的过程。此外,似乎TkXext采用了一种不同的方法,即将应用程序重新父窗口化到Tk窗口中,以用于那些不接受某种标志/选项进行嵌入的应用程序,例如在引用链接中的媒体播放器示例中的-wid - Gary
我还阅读了 SO 上关于在进程之间进行交互并尝试查找具有父窗口并使用它的进程的一些问题。也许,这类似于 TkXext,它通过名称搜索;但是我没有研究过那段代码以确定它的真正作用。我下载了它,但在花费大量时间学习可能已经过时的东西之前,我想先问问。我对使用浏览器进行此操作很感兴趣,但由于基于 Chrome 的浏览器似乎都有一个“-app”选项,可以在单独的窗口中打开 URL,所以这可能不值得一做。 - Gary

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接