当我使用Pyinstaller编译可执行文件时,我遇到了下面代码的问题。
我正在尝试使用TopLevel打开第二个GUI窗口,向其添加ScrolledText小部件,然后获取ipconfig /all
的输出并将其放入ScrolledText。
我将代码剥离到与此问题相关的代码。如果我直接运行python文件,或者在没有--windowed命令pyinstaller --onefile toolbox.py
的情况下使用Pyinstaller进行编译,那么一切似乎都有效。
当我使用--windowed pyinstaller --onefile --windowed toolbox.py
编译时,TopLevel窗口打开,我收到代码中列出的错误消息,并且ScrolledText小部件为空。
我已确认在txt.insert
命令上使用普通字符串确实有效,因此问题似乎与os.popen
命令一致。我确实尝试使用subprocess.check_output
代替os.popen
,但我收到了相同的错误消息。此外,将os.popen
命令分配给变量然后在txt.insert
中插入变量具有相同的结果。
from tkinter import *
from tkinter import ttk
from tkinter import messagebox
from tkinter import scrolledtext
import os
import sys
def netIPInfo():
"""Open a second window, displays output of ipconfig /all."""
window2 = Toplevel()
window2.title("NIC IP Info")
window2.geometry("663x650")
txt = scrolledtext.ScrolledText(window2, width=80, height=40)
txt.pack(expand=1, fill="both")
try:
txt.insert(INSERT, os.popen("ipconfig /all").read()) # ISSUE!!
except:
e = sys.exc_info()
messagebox.showinfo("Error", e) # Error message below
# {<class 'OSError'}
# {[WinError 6] The handle is invalid}
# {<traceback object at 0x02EEB260>}
txt.configure(state="disabled")
window2.mainloop()
# Primary GUI Window
window = Tk()
window.title("ProTech QST")
tab_control = ttk.Notebook(window)
tab1 = ttk.Frame(tab_control)
tab_control.add(tab1, text='Network')
lfr5 = ttk.LabelFrame(tab1, text="Information")
lfr5.pack(fill=X)
btn30 = Button(lfr5, text="NIC IP Info")
btn30.config(width=18, command=netIPInfo)
btn30.grid(column=0, row=1, sticky=W)
tab_control.pack(expand=1, fill="both")
if __name__ == "__main__":
window.mainloop()
修改
我正在使用代码更多,并发现如果我使用--windowed运行pyinstaller但没有--onefile它可以工作。使用--onefile但不使用--windowed运行pyinstaller也是如此。这是一个问题,不是代码,而是pyinstaller?