Important: Please read the Qt Code of Conduct - https://forum.qt.io/topic/113070/qt-code-of-conduct

QT: Updates can only be scheduled from GUI thread or from QQuickItem::updatePaintNode()



  • I'm trying to change Image with Pushbutton (GPIO PINs) stored inside a folder using QML with PyQt5

    Python Code:

    from gpiozero import Button
    from signal import pause
    
    from PyQt5.QtCore import *
    from PyQt5.QtGui import *
    from PyQt5.QtQml import *
    import os, time, sys
    
    
    def btn_pressed():
        global r
        return lambda: r.setProperty("source", "/home/pi/Desktop/example/sample/img/img1.jpg")
    
    button1 = Button(20)        
    myApp = QGuiApplication([])
    myEngine = QQmlApplicationEngine()
    directory = os.path.dirname(os.path.abspath(__file__))
    myEngine.load(QUrl.fromLocalFile(os.path.join(directory, 'simple1.qml')))
    if not myEngine.rootObjects():
        print("root object not found")
    
    r = myEngine.rootObjects()[0].findChild(QObject, "DisplayImage")
    dir(r)
    print("Main Thead id ",myApp.thread())
    updateUI = UpdateUI()
    
    button1.when_pressed = btn_pressed()   
    myEngine.quit.connect(myApp.quit)
    sys.exit(myApp.exec_())
    

    QML:

    import QtQuick 2.10
    import QtQuick.Controls 1.6
    import QtQuick.Window 2.2
    
    ApplicationWindow {
        id : main
        title: qsTr("Test")
        width: 640
        height: 480
        visible: true
    
        Rectangle{
            width: parent.width
            height: parent.height
    
            Image {
                id: img
                source: ""
                width : main.width;
                fillMode : Image.PreserveAspectFit
                objectName: "DisplayImage"
            }
        }
    }
    
    When I Pressed the Push Button Connected to GPIO 20 in raspberry Pi 4 , I'm Getting below error message
    
    
    
    list itemQObject: Cannot create children for a parent that is in a different thread
    (Parent is QQmlApplicationEngine(0x10f5ba0),
    parents thread is QThread(0xf6f7c0)
    current thread is QThread(0xa98007c8)
    Updates can only be scheduled from GUI thread or from QQuickItem::updatePaintNode()
    
    
    I also tried creating class with a method changing Image Source Property and then calling the same method(via Class Object) upon PushButton press but it shows same error message
    
    Is there a way to set Image Source Property in QML - from parent thread in Python.
    In Winforms we can Avoid "Cross-Thread Violation Error" by using Delegates.
    Can we Use `Signal and Slot` to Solve this Problem in PyQt5

Log in to reply