【发布时间】:2020-12-15 05:52:10
【问题描述】:
我正在尝试在使用 PyQt5 用 Python 编写的应用程序中运行 Windows 可执行文件。我对使用 PyQt5 还很陌生,但正在尝试。
我面临的问题实际上是让有问题的 EXE 在我的应用程序框架、窗口或 QWidget 中运行。
目前我不需要向 Windows 可执行文件发送或获取响应/结果,我只需要能够在我的应用程序中显示它。
class MyWindow(QWidget):
def __init__(self):
super().__init__()
self.initUI()
def initUI(self):
# create a process
exePath = "C:\\Windows\\system32\\calc.exe"
# subprocess.Popen(exePath)
os.system(exePath)
hwnd = win32gui.FindWindow(0,"Calculator")
print(hwnd)
time.sleep(0.05)
window = QtGui.QWindow.fromWinId(hwnd)
self.createWindowContainer(window, self)
self.setGeometry(500, 500, 450, 400)
self.setWindowTitle('File dialog')
self.show()
def main():
app = QApplication(sys.argv)
w = MyWindow()
sys.exit(app.exec_())
if __name__ == '__main__':
main()
我从以下代码中得到的是:
【问题讨论】:
-
你从
print(hwnd)得到了什么? -
请注意,您的术语表明您不了解这里发生的情况。可执行文件永远不会在您的应用程序“内部”运行——您正在生成一个单独的进程。该进程正在创建一个与该进程中的线程具有线程关联性的窗口(但可以创建零个或多个)。您正在尝试将创建的窗口的属性从顶级(无父级)更改为您在应用程序中创建的窗口的子级。这是对窗口的操作,而不是对可执行文件的操作。
-
另外你的睡眠是在错误的地方,你应该在寻找窗口之前留出时间来产生进程和创建窗口。
-
最后,
FindWindow只适用于USER32.DLL管理的窗口。如果您有控制台窗口或现代 UI 应用程序,则需要以完全不同的方式处理。 -
@BenVoigt 感谢本的洞察力。您是否知道我该如何完成这项工作?
标签: python python-3.x windows user-interface pyqt5