Pour un tp de python on doit faire en sorte que quand on resize la fenêtre, le graphique (label lb et pixmap px) prennent la totalité de la fenêtre et je n'y arrive pas.
J'ai tenté un self.lb.setFixedWidth(self.width()) mais quand je lance le programme il s'agrandit en boucle
je laisse le code intégral
Merci d'avance
#TP1 - EXERCICE 3: Apparition des premières fenêtres....
import sys
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
from PyQt5.QtGui import *
class MyMainWindow(QWidget):
def __init__(self, parent=None):
QWidget.__init__(self, parent=parent)
self.initUI()
def initUI(self):
self.setGeometry(300,300,500,300)
self.setWindowTitle('My Main Window')
# label
self.label = QLabel("Saisir un nombre et cliquer") #label vide pour affichage du print de DisplayMessage
# champ de texte 1 ligne
self.champ = QLineEdit()
self.champ.setValidator(QIntValidator())
# button
self.bu = QPushButton("Calcule...")
#self.bu.clicked.connect(QApplication.instance().quit)
self.bu.clicked.connect(self.DisplayMessage) #appel la fonction DisplayMessage
# champ de texte multiligne
self.champMulti = QPlainTextEdit()
# affichage du graphique
self.lb = QLabel()
self.lb.setFixedWidth(self.width())
self.lb.setFixedHeight(300)
self.lb.setFrameShape(QFrame.Panel) # pour dessiner un contour autour de la zone
self.px = QPixmap(self.width(),300)
layout = QVBoxLayout(self)
layout.addWidget(self.label)
layout.addWidget(self.champ)
layout.addWidget(self.bu)
layout.addWidget(self.champMulti)
layout.addWidget(self.lb)
self.setLayout(layout)
# affiche message a la fermeture
def closeEvent(self, event):
reponse = QMessageBox.question(self, 'Message',
"Souhaitez vous vraiment quitter?", QMessageBox.Yes, QMessageBox.No)
if reponse == QMessageBox.Yes:
event.accept()
else:
event.ignore()
# Redimentionnement de l'affichage graphique
def resizeEvent(self, event):
wc = self.width() # recupere la largeur
hc = self.height() # recupere la longueur
self.lb.setFixedWidth(self.width())
print(self.lb.width())
print('width' + str(wc) + " height" + str(hc))
# ecrit dans la fenetre le resultat de Syracuse
def DisplayMessage(self):
values = [] # values => tableau vide
self.champMulti.clear() # vide le champ multiligne
val = self.champ.text()
if not val:
self.champMulti.appendPlainText("veuillez saisir un chiffre avant de lancer le calcul...")
else:
n = int(val)
if(n > 1):
maxi = n
count = 1
while (n > 1):
if (n % 2 == 0):
n = n / 2
else:
n = 3 * n + 1 #Enlever * pour eviter la boucle infini pour n = 5
self.champMulti.appendPlainText(str(n)) #} ajoute n au champ multiligne
values.append(n) #Ajoute n à la fin du tableau
count = count + 1
if (n > maxi):
maxi = n
self.champMulti.appendPlainText("Nombre de termes dans la suite: " + str(count))
self.champMulti.appendPlainText("Valeur max de la suite: " + str(maxi))
self.px.fill(QColor(200, 200, 200)) # RAZ de la zone graphique, elle est remplie avec une couleur RGB de votre choix
painter = QPainter(self.px) # récupération de l’objet QPainter de la pixmap
for i in range(0, len(values)): # parcours dans les termes de la suite
h = max(values) # hauteur du point ou du trait
# calcul de la mise à l’échelle
x = i*self.width()/(len(values)-1) # compteur * longueur / nb element
y = 300 - ((300/h)*values[i]) # hauteur - (hauteur / element max) * element
painter.drawPoint(x,y) # tracé d’un point
if i != 0: # Si il y a un point avant
x1 = x
x2 = (i-1)*self.width()/(len(values)-1) # valeur precedente
y1 = y
y2 = 300 - ((300/h)*values[i-1]) # valeur precedente
painter.drawLine(x1,y1,x2,y2) # ou bien tracé d’un trait
self.lb.setPixmap(self.px) # la zone graphique est affecté au widget label
if __name__ == '__main__':
app = QApplication(sys.argv)
w = MyMainWindow()
w.show()
app.exec_()
probleme de resize event
× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
× Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.