Running a Windows executable (calc.exe, etc) inside a PyQt Application

时光怂恿深爱的人放手 提交于 2021-02-11 06:49:08

问题


I'm trying to run a Windows executable inside my application written in Python using PyQt5. I'm fairly new to using PyQt5 but trying.

The problem I'm facing is actually getting the EXE in question to run within my applications Frame, Window or QWidget.

At the moment I don't need to send or get responses/results to and from the Windows executable, I only need the ability to show it within my application.

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

What I get from the following Code is this:

Screenshot of running app


回答1:


Sorry, I don't know if I understood you correctly, but I suggest trying this:

import sys
import subprocess
import threading
import time
import win32gui
from PyQt5.QtCore    import Qt
from PyQt5.QtGui     import QWindow, QPixmap
from PyQt5.QtWidgets import (QWidget, QApplication, QVBoxLayout,
                             QGridLayout, QMainWindow, QLabel) 


class Example(QMainWindow):
    def __init__(self):
        super().__init__()

        self.central_widget = QWidget()
        self.setCentralWidget(self.central_widget)
        
        self.widget = QWidget()
        self.widget.setFixedSize(230, 280)
        self.widget.setStyleSheet("background-color: yellow;")
        self.label = QLabel(self)
        self.label.setPixmap(
            QPixmap('images/splash_.jpg').scaled(self.size().width()/2, self.size().height())
        )
        
        self.grid_layout = QGridLayout(self.central_widget)
        self.grid_layout.addWidget(self.widget, 0, 0, 2, 1)
        
        self.v_layout = QVBoxLayout(self.widget)
        self.initUI()
        self.grid_layout.addWidget(self.label, 0, 1, 1, 1) 
 
    def initUI(self):
        t = threading.Thread(target=self.runExe)
        t.start()
        #                                                 Calculator
        hwnd1 = win32gui.FindWindowEx(0, 0, "CalcFrame", "Калькулятор")
        start = time.time()
        while hwnd1 == 0:
            time.sleep(0.01)
            #                                                 Calculator 
            hwnd1 = win32gui.FindWindowEx(0, 0, "CalcFrame", "Калькулятор")
            end = time.time()
            if end - start > 5:
                return
        window = QWindow.fromWinId(hwnd1)
        widget = self.createWindowContainer(window, self.central_widget)
        self.v_layout.addWidget(widget)
 
    @staticmethod
    def runExe():
        exePath = "C:/Windows/system32/calc.exe"
        subprocess.Popen(exePath)

 
if __name__ == '__main__':
    app = QApplication(sys.argv)
    ex = Example()
    ex.resize(550, 400)
    ex.show()
    sys.exit(app.exec_())



来源:https://stackoverflow.com/questions/63597475/running-a-windows-executable-calc-exe-etc-inside-a-pyqt-application

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