Python 从QML文件到.py文件获取属性
我正在使用PySide2、QtQuick和QtCreator。 我试图使它使用QML文件中存储的文本字段中的变量,并运行命令,使用print()将变量打印到控制台中 在main.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(
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
}
}