Почему qt не может просто вызвать скрипт python для реализации чертежа?

Моя версия Qt 5.13, версия Python 3.7. Они 32 бита. И у меня есть код Python myDemo.py, чтобы нарисовать ломаную линию. когда я запускаю его на питоне, он может показывать полилинию. Однако , я через qt вызывал скрипт python, он ничего не показывал.

Я обнаружил, что Qt может вызывать скрипт python с классом PyObject. Я много пробовал и решаю много проблем. Но моя программа не сообщала об ошибках, когда она запускалась, она входила в программу python, но не показывала ломаную линию.

import matplotlib.pyplot as plt
import numpy as np

def getPic(str):
    print ('enter getPic...', str)
    x = np.arange(9)
    y = np.sin(x)
    z = np.cos(x)
# marker数据点样式,linewidth线宽,linestyle线型样式,color颜色
    plt.plot(x, y, marker="*", linewidth=3, linestyle="--", color="orange")
    plt.plot(x, z)
    plt.title("matplotlib")
    plt.xlabel("height")
    plt.ylabel("width")
# 设置图例
    plt.legend(["Y","Z"], loc="upper right")
    plt.grid(True)
    plt.show()
#include <QApplication>
#include <QDebug>

#pragma push_macro("slots")
#undef slots
#include <Python.h>
#pragma pop_macro("slots")

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
//    ONETEST w;
//    w.show();
    //进行初始化

    Py_Initialize();
#if 1
    //如果初始化失败,返回
    if(!Py_IsInitialized())
    {
        qDebug()<<"initial failure!";
        return a.exec();
    }

    //加载模块,模块名称为myDemo,就是myDemo.py文件
    PyObject *pModule = PyImport_ImportModule("myDemo");
    //如果加载失败,则返回
    if(!pModule)
    {
        qDebug()<<"load failure";
        return a.exec();
    }
    //加载函数getPic
    PyObject* pDict = PyModule_GetDict(pModule);
    PyObject* pFunc = PyDict_GetItemString(pDict, "getPic"); //从字典属性中获取函数
    if(pFunc && PyCallable_Check(pFunc))
    {
        //调用函数
        PyObject* pArg = Py_BuildValue("(s)", "getPic"); //参数类型转换,传递一个字符串。将c/c++类型的字符串转换为python类型,元组中的python类型查看python文档
        PyEval_CallObject(pFunc, pArg); //调用直接获得的函数,并传递参数
        QTime _Timer = QTime::currentTime().addMSecs(5000);
        while( QTime::currentTime() < _Timer )
            QCoreApplication::processEvents(QEventLoop::AllEvents, 100);

    }
    //如果失败则返回
    else
    {
        qDebug()<<"load function failure";
        return a.exec();
    }

#elif
    PyObject* pDict = PyModule_GetDict(pModule);
    PyObject* pFunc = PyDict_GetItemString(pDict, "add"); //从字典属性中获取函数
    PyObject* pArg = Py_BuildValue("(i, i)", 1, 2); //参数类型转换,传递两个整型参数
    PyObject* result = PyEval_CallObject(pFunc, pArg); //调用函数,并得到python类型的返回值
    int sum;
    PyArg_Parse(result, "i", &sum); //将python类型的返回值转换为c/c++类型
    qDebug()<<"sum = "<<sum;

 #elif
    PyRun_SimpleString("print('hello world!')");
    PyRun_SimpleString("getPic();");
#endif
    //退出
    Py_Finalize();
    return a.exec();
}



Честно говоря, я просто не знаю, каков реальный результат. Я просто хочу понять, почему он не показывает полилинии.

0 ответов

Другие вопросы по тегам