Aus Pythonprogramm weiteres Pythonprogramm einbinden oder starten

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Diana
User
Beiträge: 3
Registriert: Sonntag 7. Juli 2019, 08:04

Hi liebe Forumsgemeinde :)

ich habe bei einem kleinen Pythonprogramm ein kleines Problem. Ich habe auch schon rumgegoogled, nur funktioniert dann jedes Mal an einer anderen Stelle mein Programm nicht. Jetzt fällt mir wirklich nichts mehr ein. Da ich bisher nur kleinere Sachen in Java programmiert habe und noch kaum was in Python, bräuchte ich eure Hilfe :)

Das Programm ist eine Mathe-App. Durch klicken auf Buttons im Hauptfenster, soll man in die jeweilige "Unterapp" gelangen, die sich dann als Dialog öffnt. Die Apps sind mit PyQt5 programmiert und die Oberfläche über eine .ui Datei eingebunden. Als Einzel-App funktionieren sie auch,

Beim aufrufen der Apps aus den Hauptprogramm treten dann aber die ersten Probleme auf:
Wenn ich es über import versuche und die Hauptapp öffnen möchte, dann öffnet sich statt des Hauptprogramms, die zuerst als import eingefügte "Unterapp".

Wenn ich es so versuche wie das Programm aktuell ist, läd es beim klicken des Buttons nur die .ui Datei der "Unterapp". Dadurch fehlt dann die Hälfte von dieser "Unterapp" (die ganzen numpy und canvas und matplotsachen) und die Funktionen die ich in der .py Datei der Unterprogramme programmiert habe .

Die letze Idee die ich gefunden hatte war über <subprocess.Popen(".....")>, da passiert gar nichts. Wäre aber die wohl simpelste und beste Möglichkeit gewesen.


Vielen lieben Dank schon mal :)

Das Hauptprogramm:

Code: Alles auswählen

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Created on Sun Jul 14 13:21:55 2019

@author: kata
"""

import sys
import PyQt5.QtCore as core
import PyQt5.QtWidgets as widgets
import PyQt5.QtGui as gui
import PyQt5.uic as uic
from PyQt5.QtWidgets import QWidget, QApplication

import numpy as np
import scipy as sp
import matplotlib as mpl
import scipy.misc

from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvas
from matplotlib.backends.backend_qt5agg import NavigationToolbar2QT as NavigationToolbar
import matplotlib.pyplot as plt
import subprocess
#import sin.py
#import cos.py


class main(QWidget):
    def __init__(self):      
        super().__init__()        

app =  widgets.QApplication(sys.argv)  
w = uic.loadUi("main.ui")  
        
def clickedSinus():
    #subprocess.Popen("home/kata/Workspaces/python-workspaces/mathplotTest/MatheApp/sin.py")
    diaSin = uic.loadUi("sin.ui") 
    #diaSin.show()
    diaSin.exec_()
    print("Sinus gewählt")
    
w.btnSin.clicked.connect(clickedSinus)

def clickedCosinus():
    diaCos = uic.loadUi("cos.ui")  
    diaCos.exec_()
    #diaCos.show()
    print("Cosinus gewählt")

w.btnCos.clicked.connect(clickedCosinus)  

w.show()
sys.exit(app.exec_())
Eines der Unterprogramme:

Code: Alles auswählen

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Created on Sat Jul 13 17:05:38 2019

@author: kata
"""

import sys

import numpy as np
import scipy as sp
import matplotlib as mpl
import scipy.misc

from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvas
from matplotlib.backends.backend_qt5agg import NavigationToolbar2QT as NavigationToolbar
import matplotlib.pyplot as plt

from PyQt5 import QtWidgets, uic, QtCore, QtGui
from PyQt5.QtWidgets import QDialog, QApplication, QPushButton, QVBoxLayout
from mpl_toolkits.axisartist.axislines import SubplotZero

class sin2(QtWidgets.QDialog):    
    def __init__(self, parent=None):
        super().__init__(parent)
        self.ui = uic.loadUi("sin.ui", self)         

        self.figure = plt.figure()

        self.canvas = FigureCanvas(self.figure)

        self.toolbar = NavigationToolbar(self.canvas, self)

        self.button = QPushButton('Plot')
        self.button.clicked.connect(self.plot)
        
        layout = QVBoxLayout()
        layout.addWidget(self.toolbar)
        layout.addWidget(self.canvas)
        layout.addWidget(self.button)
        
        layout.addWidget(self.lblStrecken)
        layout.addWidget(self.hSlider)
        
        layout.addWidget(self.lblStau)
        layout.addWidget(self.hSlider_2)  
        
        layout.addWidget(self.lbla)      
        layout.addWidget(self.a)
        layout.addWidget(self.lblb)
        layout.addWidget(self.b)
        self.setLayout(layout)
        
        self.ui.hSlider.setMinimum(0)
        self.ui.hSlider.setMaximum(10)
        self.ui.hSlider.setSingleStep(0.2)
        self.ui.hSlider.valueChanged.connect(self.sliderValueChanged)
        
        self.ui.hSlider_2.setMinimum(0)
        self.ui.hSlider_2.setMaximum(10)
        self.ui.hSlider_2.setSingleStep(0.2)
        self.ui.hSlider_2.valueChanged.connect(self.sliderValueChanged2)
        
        self.ui.a.textChanged.connect(self.setA)
        self.ui.b.textChanged.connect(self.setB)
        

    def sliderValueChanged(self, value):   
        global k
        k = float(value)
        print(k)
        
    def sliderValueChanged2(self, value):   
        global k
        k = 1/float(value)
        print(k)
        
    def setA(self, value):
        global a
        a = float(value)
        print("a: ", a)
        
    def setB(self, value):
        global b
        b = float(value)
        print("b: ", b)
        
    
    def plot(self):
        self.figure.clear()
        
        print("a: ", a)
        print("b: ", b)
        print("k: ", k)

        x = np.linspace(0, 4*np.pi, 100)
        #x = np.linspace(0, 2*np.pi, 100)
        #x = np.arange(0.0, (2*np.pi), 0.01)      
        
      #  x = np.linspace(-5, 10*np.pi, 100)
        y = np.linspace(-5, 5, 100)
        y = a + np.sin((k*x)+b)
                    
        f, ax = plt.subplots()
        ax = self.figure.add_subplot(111)      
   
        tex = r'$f(x) = a + sin(k * x) + b$'
        tex_y = r'$sin(x)$'
        tex_x = r'$x$'
   
        ax.set_title(tex, fontsize=20)       
        ax.set(xlabel=tex_x, ylabel=tex_y)
        ax.grid()
        
        ax.plot(x, y)  
        plt.axis('equal')
        plt.show()
        self.canvas.draw()
       
app = QtWidgets.QApplication(sys.argv)
dialog = sin2()
dialog.show()
sys.exit(app.exec_())
[code]
__deets__
User
Beiträge: 14540
Registriert: Mittwoch 14. Oktober 2015, 14:29

Das Problem ist der Code auf Modul-Ebene. Deshalb gibt es in Python den "if __name__ == '__main__'"-guard, und der sollte auch nur eine main-Funktion aufrufen, in der dann die standalone-Variante der App hochgezogen wird. Insbesondere das QApplication-Objekt, von dem es immer nur eines geben darf.

Fuer das einbetten in deine groessere App ist es dann notwendig, die Unterapps so auszufuehren, dass sie eine Funktion "setup" oder aehnliches haben, die zB das Parent-Widget in dem die Haupt-App sie darstellen will als Argument bekommt. Doch die Kontrolle bleibt dann bei der Umbrella-App.
Antworten