【问题标题】:Running console window in background for GUI using tkinter on Windows 10在 Windows 10 上使用 tkinter 在后台为 GUI 运行控制台窗口
【发布时间】:2020-08-03 04:38:52
【问题描述】:

所以我有这个用 tkinter 制作的 GUI,一切正常。它的作用是连接到服务器并为 Linux 或 Windows 发送命令。我继续使用 pyinstaller 创建一个没有控制台的窗口 GUI,当我尝试使用特定功能发送 Windows 命令时,它会失败。如果我使用在 GUI 之前弹出的控制台创建 GUI,它就像一个魅力。我想弄清楚的是如何让我的 GUI 与用户不可见的控制台一起工作。

我的代码中有问题的部分围绕子流程展开。为了让大家免于我编写的 400 多行代码,我提供了有问题的特定代码。这是sn-p:

def rcmd_in(server):
    import subprocess as sp
    for i in command_list:
        result = sp.run(['C:/"Path to executable"/rcmd.exe', '\\\\' + server, i],
                 universal_newlines=True, stdout=sp.PIPE, stderr=sp.STDOUT)
        print(result.stdout)

参数“server”是从另一个调用“rcmd_in”的函数传递的,“command_list”是在代码根目录中创建的可变列表,所有函数都可以访问。

现在,我已经完成了我的尽职调查。我进行了多次搜索,并对我的代码进行了编辑,试图在该控制台不可见的情况下运行我的代码,使用此链接中的信息找到:recipe-subprocess。这是编辑的样子:

def rcmd_in(server):
    import subprocess as sp
    import os, os.path
    si = sp.STARTUPINFO()
    si.dwFlags |= sp.STARTF_USESHOWWINDOW
    for i in command_list:
        result = sp.run(['C:/"Path to executable"/rcmd.exe', '\\\\' + server, i],
                       universal_newlines=True, stdin=sp.PIPE, stdout=sp.PIPE, 
                       stderr=sp.STDOUT, startupinfo=si, env=os.environ)
        print(result.stdout)

我现在遇到的问题是当它运行时弹出“错误:8 - 内部错误-109”的错误。让我补充一下,我尝试使用函数 'call()'、'Popen()' 和其他函数,但似乎只有 'run()' 有效。

我已经到了让我的大脑受伤的地步,我需要一些帮助。有什么建议?与往常一样,我永远对任何人的帮助都充满热情。提前致谢!

【问题讨论】:

    标签: python-3.x tkinter subprocess pyinstaller


    【解决方案1】:

    我想通了,只用了 5 天! :D

    看起来函数失败的原因在于 Windows 如何处理标准输入。我找到了一个post,它帮助我编辑我的代码以使用 pyinstaller -w (--noconsole)。这是更新的代码:

    def rcmd_in(server):
        import subprocess as sp
        si = sp.STARTUPINFO()
        si.dwFlags |= sp.STARTF_USESHOWWINDOW
        for i in command_list:
            result = sp.Popen(['C:/"Path to executable"/rcmd.exe', '\\\\' + server, i],
                           universal_newlines=True, stdin=sp.PIPE, stdout=sp.PIPE, 
                           stderr=sp.PIPE, startupinfo=si)
            print(result.stdout.read())
    

    注意函数 'run()' 到 'Popen()' 的变化。 'run()' 函数将不能与最后的 print 语句一起使用。此外,对于那些好奇的人来说,我创建的“si”变量正在阻止“子进程”在使用 GUI 运行时打开控制台。我希望这对为此苦苦挣扎的人有用。干杯

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-04-27
      • 2020-01-29
      • 2013-06-30
      • 1970-01-01
      • 2023-03-31
      • 1970-01-01
      • 2011-09-23
      • 2014-11-12
      相关资源
      最近更新 更多