通过单击按钮获取数据,并从C ++中嵌入的Python GUI获取条目

问题描述

我有一个准系统的tkinter Python GUI,我需要从中获取文本框中的输入,然后在C ++中的其他函数中使用它们

我该怎么做?有没有办法在C ++中存储来自cpython函数调用的返回值?

我提供了示例Source.cpp和PyTest.py(GUI)。我也有一个pyhelper.hpp,它是从互联网上获得的,但不包括在内。

PyTest.py

from tkinter import *
from tkinter import ttk
from tkinter import messageBox
from tkinter import scrolledtext
from tkinter import simpledialog
#Ventana principal
root = Tk()
root.title("Menu Principal")
root.configure(bg = "#090f39")
root.geometry("1050x666")
root.resizable(width = False,height = False)

#Funciones
def clickEstudiante():
    panelMenuAdmin.grid_remove()
    panelMenuEstudiante.grid_remove()
    panelMenuEstudiante.grid(row = 3,column = 0,columnspan = 2)
    panelMenuEstudiante.configure(bg = "#000000",fg = "#ffffff")

def clickAdmin():
    panelMenuEstudiante.grid_remove()
    panelMenuAdmin.grid_remove()
    msjCodigo = simpledialog.askinteger("Menu AdminisTrador","Ingrese su codigo")
    if(isinstance(msjCodigo,int)):
        panelMenuAdmin.grid(row = 3,columnspan = 2)
        panelMenuAdmin.configure(bg = "#090f39",fg = "#ffffff")
        print(msjCodigo)
    else:
        messageBox.showerror("ERROR","Codigo invalido.")
        panelMenuEstudiante.grid(row = 3,columnspan = 2)
        panelMenuEstudiante.configure(bg = "#090f39",fg = "#ffffff")

def clickOK():
    enTradaCodigo = entryCodigo.get()
    if(isinstance(enTradaCodigo,int) != False):
        print("ERROR: Usuario no envio un entero.")
    else:
        print("Usuario envio codigo:",enTradaCodigo)
    entryCodigo.delete(0,"end")
    return enTradaCodigo

def clickEnviar():
    enTradaDatos = str(entryDatos.get())
    if(enTradaDatos == ""):
        print("Usuario no envio datos.")
    else:
        print("Usuario envio datos: ",enTradaDatos)
    entryDatos.delete(0,"end")
    return enTradaDatos

def clickReiniciar():
    textoResultado.delete('1.0',END)
    entryCodigo.delete(0,"end")
    entryDatos.delete(0,"end")

#++++++++++COMIENZA GUI++++++++++
#Labels
labelIngreso = Label(root,text = "Ingreso:")
labelIngreso.grid(row = 0,columnspan = 2)
labelIngreso.configure(bg = "#090f39",fg = "#ffffff")

labelMenu = Label(root,text = "Menu Principal")
labelMenu.grid(row = 2,columnspan = 2)
labelMenu.configure(bg = "#090f39",fg = "#ffffff")

panelMenuEstudiante = Label(root,text = """5. Matricular\n
Consultar\n 61. Sedes\n 62. Carreras\n 63. Cursos\n 64. Grupos\n
Reportes\n 71. Sede Matriculada\n 72. Carrera\n 73. Cursos\n 74. Grupos\n 75. Cupos de un Curso\n 76. Informe de Matricula\n""",justify = LEFT)

panelMenuAdmin = Label(root,text = """Insertar\n 11. Sedes\n 12. Carreras\n 13. Cursos\n 14. Grupos\n 15. Estudiantes\n 16. AdminisTradores\n
Modificar\n 21. Sedes\n 22. Carreras\n 23. Cursos\n 24. Grupos\n 25. Estudiantes\n 26. AdminisTradores\n
3. Consultar Todo\n
Reportes\n 41. Sedes\n 42. Carreras por Sede\n 43. Cursos de una Carrera\n 44. Grupos de un curso\n 45. Estudiantes por sede\n 46. Sede con mas estudiantes
 47. Sede con menos estudiantes\n 48. Cursos por estudiante\n 49. Creditos de un estudiante\n 410. Estudiante con mas cursos por sede\n 411. Cupos no utilizados
 412. Informe de matricula\n 413. Sedes recien ingresadas\n 414. Carreras recien ingresadas\n 415. Cursos recien ingresados\n 416. Grupos recien ingresados
""",justify = LEFT)

#Botones
botonestudiante = ttk.Button(root,text = "Estudiante",command = clickEstudiante)
botonestudiante.grid(row = 1,column = 0)

botonAdmin = ttk.Button(root,text = "AdminisTrador",command = clickAdmin)
botonAdmin.grid(row = 1,column = 1)

botonOK = ttk.Button(root,text = "OK",command = clickOK) #Envia codigo
botonOK.grid(row = 4,column = 1)

botonReiniciar = ttk.Button(root,text = "Reiniciar",command = clickReiniciar)
botonReiniciar.grid(row = 4,column = 2)

botonDatos = ttk.Button(root,text = "Enviar",command = clickEnviar) #Envia datos
botonDatos.grid(row = 4,column = 4)

#Entries
entryCodigo = ttk.Entry(root,width = 3)
entryCodigo.grid(row = 4,column = 0)
entryDatos = ttk.Entry(root,width = 100)
entryDatos.grid(row = 4,column = 3)

#TextBoxes
textoResultado = scrolledtext.ScrolledText(root,width = 90,height = 25)
textoResultado.grid(row = 3,column = 3,columnspan = 2)
#----------TERMINA GUI----------
#~~~~~~~~~~MAINLOOP~~~~~~~~~~
root.mainloop()

Source.py

#include <Python.h>
#include <iostream>
#include "pyhelper.hpp"

using std::cout;
using std::endl;

int main() {
    //"cpy" guarda memoria abriendo y cerrando o referenciando y dereferenciando
    //cosas automaticamente,asi no hay que preocuparse de la memoria.
    cpyInstance pyInstance;
    cpyObject pNombre = PyUnicode_FromString("PyTest");
    cpyObject pSys = PyImport_ImportModule("sys");
    cpyObject pPath = PyObject_GetAttrString(pSys,"path");
    PyList_Append(pPath,PyUnicode_FromString("."));
    cpyObject pModulo = PyImport_Import(pNombre);

    if (pModulo) {
        cpyObject pFuncclickOK = PyObject_GetAttrString(pModulo,"clickOK");
        cpyObject pInputCodigo = PyObject_CallObject(pFuncclickOK,NULL);
        if (pInputCodigo == NULL) { //This is where I get a NULL return
            printf_s("retorno NULL: " + pInputCodigo);
        }
        else { //Here I should get whatever the user inputted
            printf_s("success! retorno:" + pInputCodigo);
        }
        cpyObject pFuncclickEnviar = PyObject_GetAttrString(pModulo,"clickEnviar");
    }
    else {
        printf_s("ERROR: Modulo no se pudo importar\n");
    }
    return 0;
}

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...