Running console window in background for GUI using tkinter on Windows 10

泪湿孤枕 提交于 2020-04-30 06:37:27

问题


So I have this GUI that I made with tkinter and everything works well. What it does is connects to servers and sends commands for both Linux or Windows. I went ahead and used pyinstaller to create a windowed GUI without console and when I try to uses a specific function for sending Windows commands it will fail. If I create the GUI with a console that pops up before the GUI, it works like a charm. What I'm trying to figure out is how to get my GUI to work with the console being invisible to the user.

The part of my code that has the issue revolves around subprocess. To spare you all from the 400+ lines of code I wrote, I'm providing the specific code that has issues. Here is the snippet:

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)

The argument 'server' is passed from another function that calls to 'rcmd_in' and 'command_list' is a mutable list created in the root of the code, accessible for all functions.

Now, I have done my due diligence. I scoured multiple searches and came up with an edit to my code that makes an attempt to run my code with that console invisible, found using info from this link: recipe-subprocess. Here is what the edit looks like:

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)

The the problem I have now is when it runs an error of "Error:8 - Internal error -109" pops up. Let me add I tried using functions 'call()', 'Popen()', and others but only 'run()' seems to work.

I've reached a point where my brain hurts and I can use some help. Any suggestions? As always I am forever great full for anyone's help. Thanks in advance!


回答1:


I figured it out and it only took me 5 days! :D

Looks like the reason the function would fail falls on how Windows handles stdin. I found a post that helped me edit my code to work with pyinstaller -w (--noconsole). Here is the updated code:

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())

Note the change of functions 'run()' to 'Popen()'. The 'run()' function will not work with the print statement at the end. Also, for those of you who are curious the 'si' variable I created is preventing 'subprocess' from opening a console when being ran while using a GUI. I hope this will become useful to someone struggling with this. Cheers



来源:https://stackoverflow.com/questions/61326495/running-console-window-in-background-for-gui-using-tkinter-on-windows-10

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!