当前位置: 首页 > 知识库问答 >
问题:

Tkinter嵌入图形子流程

潘安邦
2023-03-14

我正在尝试从Tkinter界面执行编译后的Pygame图形应用程序。但是,我希望pygame界面能够启动到一个800x600图形框架中。在pygame应用程序800x600框架下的同一根窗口中,我正在寻找一种嵌入以下内容的方法:

>

  • 启动自动位于名为"lib/"OR"的子目录中的python可执行文件的xterm

    直接调用名为“lib/”文件夹中的可执行文件。

    唯一有帮助的留档我已经找到的主题是在这里:http://poultryandprogramming.wordpress.com/2012/10/28/embedded-terminal-in-pythontk-window/

    os。系统route是我看到的所有文档形式的唯一方法。

    是否可以使用子流程执行我想要的操作。波本

  • 共有1个答案

    阎伟志
    2023-03-14

    这似乎是两个不同的问题。

    首先,要在Python中直接运行可执行文件,您只需要子进程模块。我不知道当你说你已经看到了os.system的留档时,你怎么会错过这个,因为这清楚地表明:

    子进程模块为生成新进程和检索其结果提供了更强大的工具;使用该模块比使用该函数更可取。有关一些有用的食谱,请参阅sub流程留档中的用子流程模块替换旧函数部分。

    特别是,要在“lib/”文件夹中运行一些可执行文件,只需这样做:

    p = subprocess.Popen(['lib/the_executable'])
    

    但是,我猜您真的想要的不是当前工作目录中的lib,而是主脚本所在目录中的lib,对吗?为此,您需要在脚本启动时执行这样的操作:

    scriptdir = os.path.abspath(os.path.dirname(__file__))
    

    …然后当你启动孩子时,会出现这样的情况:

    path = os.path.join(scriptdir, 'lib/the_executable')
    p = subprocess.Popen([path])
    

    无论如何,一旦你有了一个Popen对象,你就可以检查p是否仍在运行,等等,方法是每隔一段时间调用poll,或者生成一个线程来阻止等待;你可以通过调用kill来杀死它;等等。Popen对象上的文档显示了您可以做的所有事情。

    如果您更喜欢运行启动Python可执行文件的xterm可执行文件,您可以这样做——只需将xterm作为第一个参数,将相关的xterm参数作为其余参数。

    但我看不出这对你有什么好处。您并没有试图在窗口中嵌入终端会话,而是在游戏本身中嵌入终端会话。从xterm会话启动GUI应用程序时,它不会在xterm窗口内运行;它在新窗口中运行。如果嵌入xterm窗口,也会发生同样的情况。

    至于在您自己的窗口中嵌入Pygame窗口,有两种方法。

    如果您正在自己编写Pygame游戏,如所示。init文档中说:

    在某些平台上,可以将pygame显示嵌入到已经存在的窗口中。为此,必须将环境变量SDL_WINDOWID设置为包含窗口id或句柄的字符串。初始化pygame显示时,将检查环境变量。请注意,在嵌入式显示器中运行时可能会有许多奇怪的副作用。

    请注意,Popen构造函数接受一个env参数:

    如果env不是None,则它必须是html" target="_blank">定义新流程的环境变量的映射;它们被使用,而不是继承当前进程的环境,这是默认行为。

    所以,你可以这样做:

    child_env = dict(os.environ)
    child_env['SDL_WINDOWID'] = the_window_id
    p = subprocess.Popen([path], env=child_env)
    

    问题是,你给它什么窗口ID?好吧,你发的博客已经有答案了。与您给xterm的-into相同的ID。

    博客没有解释如何将它限制在窗口的一部分,但它引用的代码必须是。答案是:(a)在主窗口中嵌入一个子窗口,并将子窗口的ID提供给子进程,或者(b)将整个窗口提供给子进程,然后让子进程立即创建一个子曲面,并仅绘制到该子曲面,而不是整个显示。

    但是,对于Pygame(或其他SDL)应用程序的特定情况,与xterm不同,在环境中设置SDL\u VIDEO\u WINDOW\u POS也应该有效。(据我所知,这不是Pygame的文档化特性,但它是SDL的文档化特性,因此它应该是可靠的。)

    最终,这两个应用程序之间可能需要一些合作。像这样的方法:

    Tkinter父项:

    child_env = dict(os.environ)
    child_env['SDL_WINDOWID'] = the_window_id
    child_env['SDL_VIDEO_WINDOW_POS'] = '{},{}'.format(left, top)
    p = subprocess.Popen([path, width, height], env=child_env)
    

    PyGame子:

    width, height = sys.argv[1:3]
    pygame.display.init()
    pygame.display.set_mode((width, height), pygame.NOFRAME)
    

    如果你不能修改Pygame应用程序,事情会变得更加棘手。您必须创建嵌入父窗口的两个独立窗口,或者以某种方式将两个窗口顶级停靠在一起。(后者不像X11中听起来那么可怕。每当一个窗口移动时,都会以编程方式移动另一个窗口。)不管是哪种方式,你都可以在一个子窗口中启动Pygame应用程序,然后将Tkinter的东西塞进另一个子窗口。你可以通过Tkinter做到这一点;您可能需要直接进行Xlib调用(可以通过ctypes-ing调用Xlib,也可以使用类似python-Xlib的方法)。

     类似资料:
    • 5.2 Tkinter 图形编程 Python 语言自带一个标准模块 Tkinter,这是一个功能强大的图形用户界面工具包,能 够用来开发像 Windows 应用程序一样具有窗口、菜单、按钮等图形构件的程序。本章只介 绍 Tkinter 中的绘图功能,基于 Tkinter 的 GUI 编程将在第 8 章中介绍。

    • 问题内容: 我正在尝试在用Python编码的Tkinter GUI中嵌入图。我相信下面的代码可以成功地将图形简单地放入画布中,但是我对GUI网格中的画布位置没有任何控制。我希望能够让我的GUI的一部分成为情节……而不是全部。如何放置此画布小部件? 问题答案: 您没有任何其他小部件,因此很难知道您想要其他小部件的位置。不过,我可以告诉您的是:通过这样做,您正在让Tkinter用绘图填充屏幕。这是因为

    • 问题内容: 我目前有一个程序,可以从列表中随机选择引号并通过电子邮件发送。我现在也尝试在电子邮件中嵌入图片。我遇到了一个问题,可以附加电子邮件,但报价不再起作用。我已经在网上进行了研究,但解决方案对我不起作用。请注意,我使用的是Python 3.2.2。 任何指导将不胜感激。 从上面的代码可以看出,我尝试了不同的方法(引用#) 问题答案: 您正在费力地在中构造有效的MIME消息,然后放弃它并发送一

    • 问题内容: 我正在尝试发送包含嵌入式gif图像的多部分/相关html电子邮件。该电子邮件是使用Oracle PL / SQL生成的。我的尝试失败了,图片显示为红色X(在Outlook 2007和yahoo邮件中) 我已经发送HTML电子邮件已有一段时间了,但是我现在的要求是在电子邮件中使用多个gif图像。我可以将它们存储在我们的一台Web服务器上并仅链接到它们,但是许多用户的电子邮件客户端不会自动

    • 英语单词通常有其内部结构和形成方式。例如,我们可以从“dog”“dogs”和“dogcatcher”的字面上推测它们的关系。这些词都有同一个词根“dog”,但使用不同的后缀来改变词的含义。而且,这个关联可以推广至其他词汇。例如,“dog”和“dogs”的关系如同“cat”和“cats”的关系,“boy”和“boyfriend”的关系如同“girl”和“girlfriend”的关系。这一特点并非为英

    • 嗯,我有以下模式:< br > > < li> 扩展JFrame的Java类,它实例化包含返回空白屏幕的my graph的另一个类。 第二个是一个普通类,其中包含方法main,调用包含我的图形的相同类,该类返回一个普通图形。 现在,为什么JFrame类返回空白图? 我的图形类代码。 大多数人会说,你为什么要在这里创建一个JPANEL?我没有找到如何设置它的默认大小,但即使从里面删除jpanel,它