Размер растрового изображения в Qlabel - PullRequest
0 голосов
/ 14 сентября 2018

Я пытаюсь сделать так, чтобы изображение полностью соответствовало моему ярлыку без использования setScaledContents(True), поскольку я хотел бы, чтобы мой ImageGrab имел те же размеры, что и пространство QLabel.

Я использую PIL ImageGrab с bbox. если я увеличу ширину и высоту параметров, программа завершится без ошибок. Я приложил картинку, где изображение на этикетке расположено слева от центра. Я хотел бы это в верхнем левом углу. Так что он может расширяться вниз и вправо, если я увеличу размер.

Но мне любопытно, почему я не могу увеличить размер bbox. (0, 0, 400, 220) работает нормально, но (0, 0, 420, 220) не будет загружать изображение и закрывает графический интерфейс без каких-либо ошибок.

Мне бы хотелось иметь ImageGrab с bbox (0, 0, 800, 700) и QLabel с размером (800, 700), чтобы он идеально подходил для него.

class Main(QMainWindow):
    def __init__(self, parent=None):
        QWidget.__init__(self, parent)

        self.setGeometry(200, 200, 1000, 700)
        self.setWindowTitle('threads')

        self.mainFrame = QFrame(self)
        self.mainFrame.resize(1000, 650)
        self.mainFrame.move(0, 50)
        self.mainFrame.setStyleSheet("background-color: rbg(50, 50, 50)")

        self.testButton = QPushButton("Click", self)
        self.testButton.resize(500,30)
        self.connect(self.testButton, SIGNAL("clicked()"), self.Capture)    

        self.label_ = QLabel(self.mainFrame)
        self.label_.move(10, 10)
        self.label_.resize(980, 630)
        self.label_.setStyleSheet("background-color: rbg(150, 150, 150)")

    @pyqtSlot(QImage) 
    def ChangeFrame(self, image):  

        pixmap = QPixmap.fromImage(image)           
        self.label_.setPixmap(pixmap)

    def Capture(self):       
        self.thread_ = CaptureScreen()        
        self.connect(self.thread_, SIGNAL("ChangeFrame(QImage)"), self.ChangeFrame, Qt.QueuedConnection)
        self.thread_.start()     


class CaptureScreen(QThread):
    pixmap = pyqtSignal(QImage)

    def __init__(self, parent = None):
        QThread.__init__(self)

    def __del__(self):
        print("?????")
        self.exiting = True
        self.wait()

    def run(self):         
        while(True):
            time.sleep(1/60)

            img = ImageGrab.grab(bbox=(0, 0, 420, 220))

            frame = ImageQt(img)
            frame = QImage(frame)

            self.emit( SIGNAL("ChangeFrame(QImage)"), frame)

enter image description here

1 Ответ

0 голосов
/ 14 сентября 2018

Решение состоит в том, чтобы использовать макеты и установить выравнивание в QtCore.Qt.AlignTop | QtCore.Qt.AlignLeft.

Я также рекомендую использовать новый синтаксис соединения, с другой стороны, если вы собираетесь наследовать от QMainWindow в конструкторе, который вы используете.должен позвонить.И наконец, когда вы используете QMainWindow, вы должны установить центральный виджет.

import time
from PyQt4 import QtCore, QtGui
from PIL import ImageGrab, ImageQt


class Main(QtGui.QMainWindow):
    def __init__(self, parent=None):
        QtGui.QMainWindow.__init__(self, parent)

        self.setGeometry(200, 200, 1000, 700)
        self.setWindowTitle('threads')

        main_widget = QtGui.QWidget()
        self.setCentralWidget(main_widget)

        lay = QtGui.QVBoxLayout(main_widget)
        self.testButton = QtGui.QPushButton("Click")
        self.testButton.setFixedHeight(30)
        self.testButton.clicked.connect(self.capture)

        mainFrame = QtGui.QFrame()
        mainFrame.setStyleSheet("background-color: rbg(50, 50, 50)")

        _lay = QtGui.QVBoxLayout(mainFrame)
        _lay.setContentsMargins(0, 0, 0, 0)
        self.label_ = QtGui.QLabel()
        _lay.addWidget(self.label_, 0, QtCore.Qt.AlignTop|QtCore.Qt.AlignLeft)

        lay.addWidget(self.testButton)
        lay.addWidget(mainFrame)

    @QtCore.pyqtSlot(QtGui.QImage) 
    def changeFrame(self, image):  
        pixmap = QtGui.QPixmap.fromImage(image)           
        self.label_.setPixmap(pixmap)

    @QtCore.pyqtSlot() 
    def capture(self):       
        self.thread_ = CaptureScreen()       
        self.thread_.changedFrame.connect(self.changeFrame, QtCore.Qt.QueuedConnection)
        self.thread_.start()     
        self.testButton.setDisabled(True)


class CaptureScreen(QtCore.QThread):
    changedFrame = QtCore.pyqtSignal(QtGui.QImage)

    def __del__(self):
        print("?????")
        self.exiting = True
        self.quit()
        self.wait()

    def run(self):         
        while True:
            time.sleep(1/60)
            w, h = 420, 220
            img = ImageGrab.grab(bbox=(0, 0, w, h))
            frame = ImageQt.toqimage(img)
            self.changedFrame.emit(QtGui.QImage(frame))


if __name__ == '__main__':
    import sys
    app = QtGui.QApplication(sys.argv)
    w = Main()
    w.show()
    sys.exit(app.exec_())
...