PyQt5在单线程上连续运行多线程进程

时间:2020-06-15 06:50:14

标签: python-3.x pyqt5

我正在PyQT5中开发一个应用程序,该应用程序在两侧都有两个底座,中间有一个OCC 3d查看器和一个TextEdit。 OCC查看器的.ExportToImage()方法允许截取查看器的屏幕截图。但是由于该应用程序具有响应式设计,因此可以将Viewer调整为较薄的尺寸(在某些显示分辨率下),因此屏幕快照也较薄。

GUI

Screenshot of 3d Viewer for small resolutions

我尝试将窗口调整为特定大小,然后隐藏除3D查看器之外的所有内容。这会放大查看器,从而从裁剪的屏幕截图中进行保存。但是当我隐藏并调整大小然后拍摄屏幕截图时,屏幕截图仍然显得很薄。这是代码:

def take_screenshot(self):
 Ww=self.frameGeometry().width()                   
 Wh=self.frameGeometry().height()
 self.resize(700,500)
 self.outputDock.hide() #Dock on the right
 self.inputDock.hide()  #Dock on the left
 self.textEdit.hide()   #TextEdit on the Bottom-Middle
 self.display.ExportToImage(fName)   #Display is the 3d Viewer's display on the Top-Middle
 self.resize(Ww,Wh)
 self.outputDock.show()
 self.inputDock.show()
 self.textEdit.show()

我猜想是因为上面的PyQt5的.show()、. hide()、. resize()方法是多线程的,并且一旦我运行它们,它们就不会连续运行,而是并行运行。因此,屏幕截图是在其他过程完成之前拍摄的。

有没有办法解决这个问题?还是有更好的方法?

1 个答案:

答案 0 :(得分:0)

没有多个线程。事件是循环处理的,即所谓的事件循环。

尝试:

def take_screenshot(self):
    Ww=self.frameGeometry().width()                   
    Wh=self.frameGeometry().height()
    self.resize(700,500)
    self.outputDock.hide() #Dock on the right
    self.inputDock.hide()  #Dock on the left
    self.textEdit.hide()   #TextEdit on the Bottom-Middle
    QTimer.singleShot(0, self._capture)

def _capture(self):
    # app.processEvents()  # open this line if it still doesn't work, I don't know why.
    self.display.ExportToImage(fName)   #Display is the 3d Viewer's display on the Top-Middle
    self.resize(Ww,Wh)
    self.outputDock.show()
    self.inputDock.show()
    self.textEdit.show()