Programm startet sich selbst neu

Python und das Qt-Toolkit, erstellen von GUIs mittels des Qt-Designers.
Antworten
Brando
User
Beiträge: 171
Registriert: Donnerstag 28. Januar 2016, 15:36

Hallo, folgender Code

Code: Alles auswählen

# -*- coding: utf-8 -*-
"""
Created on Tue Mar 29 08:34:08 2016

@author: rk480158
"""


import sys
import matplotlib as mpl
from matplotlib.backends.backend_agg import FigureCanvasAgg
from PyQt4  import QtGui, QtCore
from PyQt4.QtCore import pyqtSlot,SIGNAL,SLOT
import matplotlib.pyplot as plt
from matplotlib import rcParams
from sympy.matrices import *
from sympy.printing import *
from IPython.display import display, HTML, Math, Latex, clear_output
# from ipywidgets import widgets
from random import randint
import os


app = QtGui.QApplication(sys.argv)
rcParams['text.usetex'] = True
rcParams['text.latex.preamble'] = r'\usepackage{amsmath}'
x = Matrix()
y = Matrix()
w = QtGui.QWidget()
nm = QtGui.QLineEdit(w)
nm.setGeometry(5,100,40,40)
position = 0

def mathTex_to_QPixmap(mathTex, fs):

    #---- set up a mpl figure instance ----

    fig = mpl.figure.Figure()
    fig.patch.set_facecolor('none')
    fig.set_canvas(FigureCanvasAgg(fig))
    renderer = fig.canvas.get_renderer()

    #---- plot the mathTex expression ----

    ax = fig.add_axes([0, 0, 1, 1])
    ax.axis('off')
    ax.patch.set_facecolor('none')
    t = ax.text(0, 0, mathTex, ha='left', va='bottom', fontsize=fs)

    #---- fit figure size to text artist ----

    fwidth, fheight = fig.get_size_inches()
    fig_bbox = fig.get_window_extent(renderer)

    text_bbox = t.get_window_extent(renderer)

    tight_fwidth = text_bbox.width * fwidth / fig_bbox.width
    tight_fheight = text_bbox.height * fheight / fig_bbox.height

    fig.set_size_inches(tight_fwidth, tight_fheight)

    #---- convert mpl figure to QPixmap ----

    buf, size = fig.canvas.print_to_buffer()
    qimage = QtGui.QImage.rgbSwapped(QtGui.QImage(buf, size[0], size[1],
                                                  QtGui.QImage.Format_ARGB32))
    qpixmap = QtGui.QPixmap(qimage)

    # return qpixmap.toImage()
    # return qimage
    return qpixmap
    
def window():
#   app = QtGui.QApplication(sys.argv)
#   rcParams['text.usetex'] = True
#   rcParams['text.latex.preamble'] = r'\usepackage{amsmath}'
#   x = Matrix()
   global x,y,nm,w 
   x = Matrix([randint(-20,20), randint(-20,20), randint(-20,20)])
   a1 = latex(x) 
#   w = QtGui.QWidget()

   b = QtGui.QLabel(w)
   headerline='$%s$'%a1
  # headerline= '$C_{soil}=(1 - n) C_m + \\theta_w C_w$'
   bild = mathTex_to_QPixmap(headerline, 15)
   label_x = QtGui.QLabel(w)
   # pixmap = QPixmap(sys.argv[1])
   label_x.setPixmap(bild)
   label_x.setGeometry(5,5,50,100)
   label_x.show()
   
   y = Matrix()
   y = Matrix([randint(-20,20), randint(-20,20), randint(-20,20)])
   a2 = latex(y) 
   headerline='$%s$'%a2
  # headerline= '$C_{soil}=(1 - n) C_m + \\theta_w C_w$'
   bild = mathTex_to_QPixmap(headerline, 15)
   label_y = QtGui.QLabel(w)
   # pixmap = QPixmap(sys.argv[1])
   label_y.setPixmap(bild)
   label_y.setGeometry(50,5,50,100)
   label_y.show()
   
   label_aufgabe = QtGui.QLabel(w)
   label_aufgabe.setText("Wie lautet das Skalarprodukt?")
   label_aufgabe.show()
   
#   nm=QtGui.QLineEdit(w)
#   nm.setGeometry(5,100,40,40)
   nm.show()
   #zahl =  nm.text()
   b1=QtGui.QPushButton(w)
   b1.setGeometry(5,170,70,40)
   b1.setText("Berechnen")
 #  b1.show()
   # w.connect(b1,QtCore.SIGNAL("clicked()"),QtGui.qApp,QtCore.SLOT("showdialog()"))
   #self.connect(btnQuit, QtCore.SIGNAL('clicked()'),
    #                QtGui.qApp, QtCore.SLOT('quit()'))
   b1.clicked.connect(showdialog)   
   b1.show()
   b2=QtGui.QPushButton(w)
   b2.setGeometry(50,100,150,40)
   b2.setText("Neuer Durchgang") 
   b2.clicked.connect(neu)
   b2.show()
   
   
   
   #nm.textChanged.connect(showdialog)
  # if (b1.clicked.connect(self.buttonClicked)):
   #   showdialog()
   w.setGeometry(100,100,400,400)
# b.move(50,20)
   w.setWindowTitle("PyQt")
   w.show()
   sys.exit(app.exec_())

def neu(): 
 #   python = sys.executable
 #   os.execl(python, python, * sys.argv)
    os.execv(Skalar_Qt_version3, sys.argv)
    
def showdialog():
   global x,y,nm,w,position 
 #  position = position + 50
   label_lsg = QtGui.QLabel(w)
   label_lsg.setGeometry(80,80,270,270)
   #label_lsg.setText("")
   label_lsg.clear()
   #print("%s"%nm.text)
   z = x.dot(y)
   print(z)
   parsed = "{0}".format(z)
   #print(parsed)
   #print(nm.text())
   if parsed == nm.text():
       ausgabe = "Richtig"
   else: 
       ausgabe = "Falsch"
#       
#   label_lsg = QtGui.QLabel(w)
#   label_lsg.setGeometry(80,80,270,270)
   # label_lsg.setText("%s"%ausgabe)
#   label_lsg.setGeometry(80,80,170,170)
   label_lsg.show()
   #print ("Guten Morgen ",x) 
   if ausgabe == 'Richtig':
      msg = QtGui.QMessageBox()
      msg.setIcon(QtGui.QMessageBox.Information)
      msg.setText("your answer is right")
#   msg.setInformativeText("This is additional information")
#   msg.setWindowTitle("MessageBox demo")
#   msg.setDetailedText("The details are as follows:")
#   msg.setStandardButtons(QtGui.QMessageBox.Ok | QtGui.QMessageBox.Cancel)
      msg.exec_()
   else: 
      msg = QtGui.QMessageBox()
      msg.setIcon(QtGui.QMessageBox.Information)
      msg.setText("your answer is wrong")
      msg.exec_()
   #msg.buttonClicked.connect(msgbtn)
	
   #retval = msg.exec_()
	
if __name__ == '__main__':
 #   w = QtGui.QWidget()
  #  x = Matrix()
   # y = Matrix()
    # nm=QtGui.QLineEdit(w)
    # nm.setGeometry(5,100,40,40)   
    window()
Die Funktion neu() soll das Programm nochmals starten. Sie funktioniert aber nicht. Und kann ich zugleich den vorherigen Lauf des Programmes abbrechen?
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

@Brando: lass das mit den *-Importen! sympy.printing importiert Dir so lustige Namen wie str und repr, bei denen 99.9% aller Pythonprogrammierer davon ausgehen, dass die auf Built-ins verweisen. Vergiss dass es global gibt. Vor allem bei so aussagekräftigen Namen wie x, y oder w freut sich jeder, das zu debuggen. Lerne und wende OOP an.
Wenn Du hier Code postest, sollte der einigemaßen aufgeräumt sein und nur das nötigste zum Nachvollziehen des Problems enthalten. Dass Du Versionskontrolle über Kommentare machst scheint nur für Dich übersichtlich zu sein. Braucht man zum Testen der neu-Funktion wirklich dieses ganze LaTeX-Zeug?

Warum willst Du das Programm neustarten? Normalerweise reicht es, ein paar Felder zurückzusetzen um den Anfangszustand wiederherzustellen. Wäre das Programm einigermaßen stukturiert, wäre das wohl ein Funktionsaufruf.
Brando
User
Beiträge: 171
Registriert: Donnerstag 28. Januar 2016, 15:36

Mein Programm läuft doch. Bitte ausprobieren! Nur die Funktion neu(), die einen Restart des Programmes bewirken soll, funktioniert noch nicht. Da bräuchte ich Hilfe!
Benutzeravatar
Madmartigan
User
Beiträge: 200
Registriert: Donnerstag 18. Juli 2013, 07:59
Wohnort: Berlin

Brando hat geschrieben:[...] Nur die Funktion neu() [...] Da bräuchte ich Hilfe!
Das ist so nicht ganz korrekt. Wie Sirius dir bereits aufgezeigt hat, weist dein Code diverse Schwachstellen/Risiken auf. Warum willst du das ignorieren?

- Globale Variablen sind wie Feuer, es gibt sie, aber man sollte die Finger davon lassen.

- Einzelne Buchstaben als Variablennamen zu verwenden ist ebenfalls nicht ratsam. Viel Spaß beim Refactoring...

- Vermeide deutsche Namensgebung im Code. Zumindest entscheide dich für eine Sprache, mixen ist sehr unsauber.

- Der Methodenname "neu()" ist zu unspezifisch? Was passiert da? Was wird neu erzeugt? Diese Fragen sollten bereits vom Namen der Methode ersichtlich sein.

- OOP ist nicht das Allerheilsmittel, für GUI-Entwicklung aber unerlässlich und daher kann man gar nicht übertrieben genug dazu raten, sich damit vertraut zu machen.

Fang doch mit diesen offensichtlichen Dingen an, danach lassen sich Fragen zum Code-Design (im Sinne von 'Brauchst du wirklich eine neu() Methode?') viel besser diskutieren.
Brando
User
Beiträge: 171
Registriert: Donnerstag 28. Januar 2016, 15:36

Hallo, ich habe versucht den Code anzupassen, aber jetzt läuft nichts. Was ist mein Fehler?

Code: Alles auswählen

# -*- coding: utf-8 -*-
"""
Created on Sun Mar 27 15:26:32 2016

@author: rk480158
"""

# -*- coding: utf-8 -*-
"""
Created on Mon Mar 21 10:43:11 2016

@author: rk480158
"""


import sys
import matplotlib as mpl
from matplotlib.backends.backend_agg import FigureCanvasAgg
from PyQt4  import QtGui, QtCore
from PyQt4.QtCore import pyqtSlot,SIGNAL,SLOT
import matplotlib.pyplot as plt
from matplotlib import rcParams
from sympy.matrices import *
from sympy.printing import *
from IPython.display import display, HTML, Math, Latex, clear_output
# from ipywidgets import widgets
from random import randint
from PyQt4.QtCore import SIGNAL
from PyQt4.QtGui import QDialog, QApplication, QPushButton, QLineEdit, QFormLayout




def mathTex_to_QPixmap(mathTex, fs):

    #---- set up a mpl figure instance ----

    fig = mpl.figure.Figure()
    fig.patch.set_facecolor('none')
    fig.set_canvas(FigureCanvasAgg(fig))
    renderer = fig.canvas.get_renderer()

    #---- plot the mathTex expression ----

    ax = fig.add_axes([0, 0, 1, 1])
    ax.axis('off')
    ax.patch.set_facecolor('none')
    t = ax.text(0, 0, mathTex, ha='left', va='bottom', fontsize=fs)

    #---- fit figure size to text artist ----

    fwidth, fheight = fig.get_size_inches()
    fig_bbox = fig.get_window_extent(renderer)

    text_bbox = t.get_window_extent(renderer)

    tight_fwidth = text_bbox.width * fwidth / fig_bbox.width
    tight_fheight = text_bbox.height * fheight / fig_bbox.height

    fig.set_size_inches(tight_fwidth, tight_fheight)

    #---- convert mpl figure to QPixmap ----

    buf, size = fig.canvas.print_to_buffer()
    qimage = QtGui.QImage.rgbSwapped(QtGui.QImage(buf, size[0], size[1],
                                                  QtGui.QImage.Format_ARGB32))
    qpixmap = QtGui.QPixmap(qimage)

   
    return qpixmap
    
class Form(QDialog):
   
    def __init__(self, parent=None):
        super(Form, self).__init__(parent)
        self.w = QtGui.QWidget()
        x = Matrix()
        x = Matrix([randint(-20,20), randint(-20,20), randint(-20,20)])
        a1 = latex(x) 
        #w = QtGui.QWidget()
        # self.b = QtGui.QLabel(w)
        headerline='$%s$'%a1
  # headerline= '$C_{soil}=(1 - n) C_m + \\theta_w C_w$'
        bild = mathTex_to_QPixmap(headerline, 15)
        self.label_x = QtGui.QLabel(self.w)
   # pixmap = QPixmap(sys.argv[1])
        self.label_x.setPixmap(bild)
        self.label_x.setGeometry(5,5,50,100)
        self.label_x.show()
   
        y = Matrix()
        y = Matrix([randint(-20,20), randint(-20,20), randint(-20,20)])
        a2 = latex(y) 
        headerline='$%s$'%a2
  # headerline= '$C_{soil}=(1 - n) C_m + \\theta_w C_w$'
        bild = mathTex_to_QPixmap(headerline, 15)
        self.label_y = QtGui.QLabel(self.w)
   # pixmap = QPixmap(sys.argv[1])
        self.label_y.setPixmap(bild)
        self.label_y.setGeometry(50,5,50,100)
        self.label_y.show()
   
        self.le = QtGui.QLineEdit(self.w)
        self.le.setObjectName("Ergebnis")
        # self.le.setText("Host")
        self.le.show()

        self.pb = QtGui.QPushButton(self.w)
        self.pb.setObjectName("connect")
        self.pb.setText("Berechne") 
        self.pb.show()
        self.w.setGeometry(100,100,400,400)
# b.move(50,20)
        self.w.setWindowTitle("PyQt")
        self.w.show()
        sys.exit(app.exec_())


    def button_click(self):
        # shost is a QString object
        shost = self.le.text()
        print shost
        
   

	

app = QApplication(sys.argv)
rcParams['text.usetex'] = True
rcParams['text.latex.preamble'] = r'\usepackage{amsmath}'
#w = QtGui.QWidget()

# form = Form()
# form.show()
app.exec_()
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

@Brando: läuft nicht ist eine ganz schlechte Fehlerbeschreibung. Was passiert? Gibt es einen Fehler? Das mit den *-Importen ist in Deinem Fall nicht nur eine Unschönheit sondern ein großes Problem. Du benutzt immer noch globale Variablen, woran es auch liegt, dass, falls Du Form auch verwendest, Dein Programm nicht läuft. Die Variablennamen sind immer noch nicht besser geworden, die dürfen auch mehr als 2 Buchstaben haben und Objekte an Namen zu binden um sie in der nächsten Zeile wieder zu verwerfen, ist ziemlich unsinnig.
BlackJack

@Brando: Also bei mir läuft das Programm. Es wird ein `QApplication`-Exemplar erzeugt, zwei Einstellungen von Matplotlib geändert, und die Qt-Hauptschleife ausgeführt. Und das solange bis man den Prozess abbricht. Dazu hätte es aber deutlich weniger Quelltext bedurft, und das Ändern der Matplotlib-Einstellungen hätte man sich auch sparen können. Hier mal das überarbeitete Programm:

Code: Alles auswählen

#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
Created on Sun Mar 27 15:26:32 2016

@author: rk480158
"""
import sys
from PyQt4.QtGui import QApplication


def main():
    app = QApplication(sys.argv)
    sys.exit(app.exec_())


if __name__ == '__main__':
    main()
Da möchtest Du dann vielleicht noch Code hinzufügen der auch irgend etwas anzeigt, sonst macht das nicht so viel Sinn. ;-)
Antworten