Python 从QML文件到.py文件获取属性

Python 从QML文件到.py文件获取属性,python,qml,pyside2,Python,Qml,Pyside2,我正在使用PySide2、QtQuick和QtCreator。 我试图使它使用QML文件中存储的文本字段中的变量,并运行命令,使用print()将变量打印到控制台中 在main.py文件中,我创建了以下代码,用于查找加密货币资产的价格 def assetSet(self): asset = "xrp" url2 = f'https://coinmarketcap.com/currencies/{asset}' page2 = requests.get(

我正在使用PySide2、QtQuick和QtCreator。 我试图使它使用QML文件中存储的文本字段中的变量,并运行命令,使用print()将变量打印到控制台中

在main.py文件中,我创建了以下代码,用于查找加密货币资产的价格

def assetSet(self):
    asset = "xrp"
    url2 = f'https://coinmarketcap.com/currencies/{asset}'
    page2 = requests.get(url2)
    soup2 = bs(page2.text, 'html.parser')
    price2 = soup2.find(class_="priceValue___11gHJ")
    price12 = str(price2)
    result2 = re.search('<div class="priceValue___11gHJ">(.*)</div>', price12)
    result12 = result2.group(1)
    self.setAsset.emit(f"The price of {asset} is {result12}")
我希望资产变量等于存储在QML文件中的文本字段,并在单击按钮时运行此命令。
有什么方法可以做到这一点吗?

在这种情况下,最好使用一个接收数据的插槽,因为函数的执行也是同步的,所以不需要信号:

@Slot(str,result=str)
def资产集(自身、资产):
url2=f'https://coinmarketcap.com/currencies/{asset}'
page2=请求。获取(url2)
soup2=bs(page2.text,'html.parser')
price2=soup2.find(class=“priceValue\uuuuuu 11gHJ”)
价格12=str(价格2)
result2=重新搜索(“(.*”,价格12)
结果12=结果2。组(1)
返回f“资产的价格为{result12}”

另一方面,请求会阻止Qt事件循环,导致GUI冻结,因此最好在另一个线程中执行该任务:

从functools导入缓存的\u属性
导入操作系统路径
进口稀土
导入系统
导入线程
导入请求
从bs4导入BeautifulSoup作为bs
从PySide2.QtCore导入QObject、Qt、QUrl、信号、插槽
从PySide2.QtGui导入qgui应用程序
从PySide2.QtQml导入QQmlApplicationEngine
班级工作人员(QObject):
完成=信号(str)
def启动(自身、资产):
threading.Thread(target=self.\u execute,args=(asset,),daemon=True).start()
def_执行(自身、资产):
url2=f“https://coinmarketcap.com/currencies/{asset}”
page2=请求。获取(url2)
soup2=bs(page2.text,“html.parser”)
price2=soup2.find(class=“priceValue\uuuuuu 11gHJ”)
价格12=str(价格2)
result2=重新搜索(“(.*”,价格12)
如果result2不是None:
结果12=结果2。组(1)
self.finished.emit(f“资产的价格为{result12}”)
返回
self.finished.emit(f“对于{asset}失败”)
类后端(QObject):
资产变更=信号(str)
def uuu init uuu(self,parent=None):
super()。\uuuu init\uuuu(父级)
self.worker.finished.connect(self.assetChanged)
@缓存的不动产
def工作人员(自我):
返回工人()
@插槽(str)
def资产集(自身、资产):
self.worker.start(资产)
def main():
app=qgui应用程序(sys.argv)
引擎=QQmlApplicationEngine()
backend=backend()
engine.rootContext().setContextProperty(“后端”,后端)
CURRENT_DIR=os.path.dirname(os.path.realpath(uu文件_uu))
file=os.path.join(当前目录,“main.qml”)
url=QUrl.fromLocalFile(文件)
创建的def句柄对象(对象、对象url):
如果obj为无且url==obj_url:
QCoreApplication.exit(-1)
engine.objectCreated.connect(handle\u object\u created,Qt.QueuedConnection)
引擎加载(url)
sys.exit(app.exec_())
如果名称=“\uuuuu main\uuuuuuuu”:
main()

非常感谢。如果你同意的话,你能解释一下这是怎么回事吗?我还是python新手,希望尽可能多地学习。再次感谢你!哦,好的,明白了。谢谢你的链接,我会仔细阅读的!另外,当我启动应用程序时,会出现一条警告:…/qml/pages/homePage.qml:171:5:qml连接:在Connections元素中检测到函数“onAssetChanged”。这可能是一个信号处理程序,但目标的信号与名称不匹配。是否有修复方法?是的,我逐字逐句地编写了您为我提供的代码。@Final_Software我没有此错误消息:1)我假设您使用的是最新版本的库,2)尝试我的完整演示(不要将其放入您的项目代码中,因为您的代码可能有其他错误),3)如果我的演示有效,那么问题出在您的项目代码中,不幸的是,我无法帮助您解决。对不起,当我将其放在代码的顶部时,它有效。非常感谢。
            CustomButton{
                id: btnBdo
                text: "Check"
                anchors.verticalCenter: parent.verticalCenter
                anchors.horizontalCenterOffset: 200
                anchors.horizontalCenter: parent.horizontalCenter
                anchors.verticalCenterOffset: 0
                font.pointSize: 20
                colorMouseOver: "#21252d"
                colorPressed: "#191d23"
                colorDefault: "#2a303a"
                onClicked: {
                    backend.assetSet()
                }
            }
            CustomTextField {
                id: textField
                anchors.verticalCenter: parent.verticalCenter
                anchors.horizontalCenterOffset: -100
                anchors.horizontalCenter: parent.horizontalCenter
                font.pointSize: 20
                placeholderText: qsTr("Enter a name")
                objectName: "assetField"
            }
onClicked: function(){
    var resp = backend.assetSet(textField.text)
    console.log(resp)
}
import QtQuick 2.15
import QtQuick.Controls 2.15

ApplicationWindow {
    width: 640
    height: 480
    visible: true

    Column {
        Button {
            id: button

            text: "Press me"
            onClicked: function() {
                backend.assetSet(textField.text);
            }
        }

        TextField {
            id: textField

            placeholderText: qsTr("Enter a name")
        }

        Label {
            id: label
        }

    }

    Connections {
        function onAssetChanged(asset) {
            label.text = asset;
        }

        target: backend
    }

}