From 44bb109c904cc2b363c94dfa641d9bc08600cd69 Mon Sep 17 00:00:00 2001 From: Alnotz Date: Mon, 25 Jul 2022 11:20:46 +0200 Subject: [PATCH] PyQt more correct! --- PyQt/Exam/Examen.py | 413 ++++++++++++++++++ .../examen_python_2015-2016_session_1.pdf | Bin 0 -> 34157 bytes PyQt/bidule.py | 86 ++++ PyQt/core.py | 34 ++ PyQt/requirements.txt | 13 + 5 files changed, 546 insertions(+) create mode 100644 PyQt/Exam/Examen.py create mode 100644 PyQt/Exam/examen_python_2015-2016_session_1.pdf create mode 100644 PyQt/bidule.py create mode 100644 PyQt/core.py create mode 100644 PyQt/requirements.txt diff --git a/PyQt/Exam/Examen.py b/PyQt/Exam/Examen.py new file mode 100644 index 0000000..38d627d --- /dev/null +++ b/PyQt/Exam/Examen.py @@ -0,0 +1,413 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- +""" +Created on Tue Mar 28 09:45:30 2017 + +@author: fh + +Examen de David Cassagne. +""" + +import numpy as np +import matplotlib.pyplot as plt +import sys +from PyQt5.QtWidgets import QApplication, QWidget, QPushButton, QVBoxLayout, QLabel, QLineEdit, QCheckBox, QGroupBox +from PyQt5.QtCore import Qt +""" +Interface graphique - dipositif de sécurité à 4 cases +""" +class Digicode(QWidget): + def __init__(self): + QWidget.__init__(self) + self.setWindowTitle("Digicode") + self.resize(250,250) + self.layout=QVBoxLayout()#Mettre en forme. + self.setLayout(self.layout) + + self.cocheA=QCheckBox("A") + self.cocheA.clicked.connect(self.set_affiche) + self.layout.addWidget(self.cocheA) + self.cocheB=QCheckBox("B") + self.cocheB.clicked.connect(self.set_affiche) + self.layout.addWidget(self.cocheB) + self.cocheC=QCheckBox("C") + self.cocheC.clicked.connect(self.set_affiche) + self.layout.addWidget(self.cocheC) + self.cocheD=QCheckBox("D") + self.cocheD.clicked.connect(self.set_affiche) + self.layout.addWidget(self.cocheD) + + self.affiche=QLabel("Affiche: Éteint") + self.layout.addWidget(self.affiche) + def set_affiche(self): + a=self.cocheA.checkState() + b=self.cocheB.checkState() + c=self.cocheC.checkState() + d=self.cocheD.checkState() + oui=Qt.Checked; non=Qt.Unchecked + if a==oui and b==non and c==oui and d==non: + self.affiche.setText("Affiche: Allumé") + else: + self.affiche.setText("Affiche: Éteint") + +def ctrlfenDigicode(): + # Premiere etape : creation d'une application Qt avec QApplication + # afin d'avoir un fonctionnement correct avec IDLE ou Canopy + # on verifie s'il existe deja une instance de QApplication + app = QApplication.instance() + if not app: # sinon on cree une instance de QApplication + app = QApplication(sys.argv) + # creation d'une fenetre avec QWidget dont on place la reference dans fen + fen = Digicode() + # la fenetre est rendue visible + fen.show() + # execution de l'application, l'execution permet de gerer les evenements + app.exec_() +#ctrlfenDigicode() +""" +Gestion d'un mois et d'une année +""" +class Calendrier(QWidget): + def __init__(self): + QWidget.__init__(self) + self.setWindowTitle("Calendrier") + self.resize(250,250) + self.layout=QVBoxLayout()#Mettre en forme. + self.setLayout(self.layout) + + self.champ_mois=QLabel("Mois : 01") + self.layout.addWidget(self.champ_mois) + + self.mmois=QPushButton("-mois") + self.mmois.clicked.connect(self.set_mmois) + self.layout.addWidget(self.mmois) + + self.pmois=QPushButton("+mois") + self.pmois.clicked.connect(self.set_pmois) + self.layout.addWidget(self.pmois) + + self.champ_annee=QLabel("Année : 2015") + self.layout.addWidget(self.champ_annee) + + self.mannee=QPushButton("-année") + self.mannee.clicked.connect(self.set_mannee) + self.layout.addWidget(self.mannee) + + self.pannee=QPushButton("+année") + self.pannee.clicked.connect(self.set_pannee) + self.layout.addWidget(self.pannee) + + self.avance=QCheckBox("Avance Rapide") + self.avance.clicked.connect(self.rapide) + self.layout.addWidget(self.avance) + + def set_mmois(self): + mois=self.champ_mois.text() + m=int(mois[7:9]) + annee=self.champ_annee.text() + a=int(annee[8:12]) + if m==1: + self.champ_mois.setText("Mois : 12") + self.champ_annee.setText("Année : {}".format(a-1)) + else: + self.champ_mois.setText("Mois : {}".format(str(m-1).zfill(2))) + + def set_pmois(self): + mois=self.champ_mois.text() + m=int(mois[7:9]) + annee=self.champ_annee.text() + a=int(annee[8:12]) + if m==12: + self.champ_mois.setText("Mois : 01") + self.champ_annee.setText("Année : {}".format(a+1)) + else: + self.champ_mois.setText("Mois : {}".format(str(m+1).zfill(2))) + + def set_mannee(self): + annee=self.champ_annee.text() + a=int(annee[8:12]) + self.champ_annee.setText("Année : {}".format(str(a-1).zfill(4))) + + def set_pannee(self): + annee=self.champ_annee.text() + a=int(annee[8:12]) + self.champ_annee.setText("Année : {}".format(str(a+1).zfill(4))) + + def rapide(self): + c=self.avance.checkState() + oui=Qt.Checked; non=Qt.Unchecked + if c==oui: + self.mmois.clicked.disconnect(self.set_mmois) + self.pmois.clicked.disconnect(self.set_pmois) + self.pannee.clicked.disconnect(self.set_pannee) + self.mannee.clicked.disconnect(self.set_mannee) + self.mmois.clicked.connect(self.set_rmmois) + self.pmois.clicked.connect(self.set_rpmois) + self.pannee.clicked.connect(self.set_rpannee) + self.mannee.clicked.connect(self.set_rmannee) + elif c==non: + self.mmois.clicked.disconnect(self.set_rmmois) + self.pmois.clicked.disconnect(self.set_rpmois) + self.pannee.clicked.disconnect(self.set_rpannee) + self.mannee.clicked.disconnect(self.set_rmannee) + self.mmois.clicked.connect(self.set_mmois) + self.pmois.clicked.connect(self.set_pmois) + self.pannee.clicked.connect(self.set_pannee) + self.mannee.clicked.connect(self.set_mannee) + + def set_rmmois(self): + mois=self.champ_mois.text() + m=int(mois[7:9]) + annee=self.champ_annee.text() + a=int(annee[8:12]) + if m==1: + self.champ_mois.setText("Mois : 10") + self.champ_annee.setText("Année : {}".format(a-1)) + elif m==2: + self.champ_mois.setText("Mois : 11") + self.champ_annee.setText("Année : {}".format(a-1)) + elif m==3: + self.champ_mois.setText("Mois : 12") + self.champ_annee.setText("Année : {}".format(a-1)) + else: + self.champ_mois.setText("Mois : {}".format(str(m-3).zfill(2))) + + def set_rpmois(self): + mois=self.champ_mois.text() + m=int(mois[7:9]) + annee=self.champ_annee.text() + a=int(annee[8:12]) + if m==10: + self.champ_mois.setText("Mois : 01") + self.champ_annee.setText("Année : {}".format(a+1)) + elif m==11: + self.champ_mois.setText("Mois : 02") + self.champ_annee.setText("Année : {}".format(a+1)) + elif m==12: + self.champ_mois.setText("Mois : 03") + self.champ_annee.setText("Année : {}".format(a+1)) + else: + self.champ_mois.setText("Mois : {}".format(str(m+2).zfill(2))) + + def set_rmannee(self): + annee=self.champ_annee.text() + a=int(annee[8:12]) + self.champ_annee.setText("Année : {}".format(str(a-10).zfill(4))) + + def set_rpannee(self): + annee=self.champ_annee.text() + a=int(annee[8:12]) + self.champ_annee.setText("Année : {}".format(str(a+10).zfill(4))) +def ctrlfenCalendrier(): + # Premiere etape : creation d'une application Qt avec QApplication + # afin d'avoir un fonctionnement correct avec IDLE ou Canopy + # on verifie s'il existe deja une instance de QApplication + app = QApplication.instance() + if not app: # sinon on cree une instance de QApplication + app = QApplication(sys.argv) + # creation d'une fenetre avec QWidget dont on place la reference dans fen + fen = Calendrier() + # la fenetre est rendue visible + fen.show() + # execution de l'application, l'execution permet de gerer les evenements + app.exec_() +#ctrlfenCalendrier() + +""" +Interface graphique - Echange de messages entre trois fenêtres(Cassé) +""" + +class Chat0(QWidget): + def __init__(self): + QWidget.__init__(self) + self.nom="vide" + self.vsn0=self + self.vsn1=self + self.setWindowTitle(self.nom) + self.resize(250,250) + self.layout=QVBoxLayout()#Mettre en forme. + self.setLayout(self.layout) + + self.texto=QLabel("texto") + self.layout.addWidget(self.texto) + + self.redac=QLineEdit("Tape ici.") + self.layout.addWidget(self.redac) + + self.groupe=QGroupBox("Boîte à bouttons") + self.groupe_layout=QVBoxLayout(self.groupe) + self.setLayout(self.groupe_layout) + self.layout.addWidget(self.groupe) + + self.valide0=QPushButton("Envoi {}".format(self.vsn0.nom)) + self.valide0.clicked.connect(self.envoi0) + self.groupe_layout.addWidget(self.valide0) + + self.valide1=QPushButton("Envoi {}".format(self.vsn1.nom)) + self.valide1.clicked.connect(self.envoi1) + self.groupe_layout.addWidget(self.valide1) + + def envoi0(self): + txt=self.redac.text() + txt0=self.vsn0.texto.text() + self.vsn0.texto.setText(txt0+"\n"+txt) + + def envoi1(self): + txt=self.redac.text() + txt0=self.vsn1.texto.text() + self.vsn1.texto.setText(txt0+"\n"+txt) + +class Chat(QWidget): + def __init__(self,user,v0,v1): + QWidget.__init__(self) + self.nom=user + self.vsn0=v0 + self.vsn1=v1 + self.setWindowTitle(self.nom) + self.resize(250,250) + self.layout=QVBoxLayout()#Mettre en forme. + self.setLayout(self.layout) + + self.texto=QLabel("texto") + self.layout.addWidget(self.texto) + + self.redac=QLineEdit("Tape ici.") + self.layout.addWidget(self.redac) + + self.groupe=QGroupBox("Boîte à bouttons") + self.groupe_layout=QVBoxLayout(self.groupe) + self.setLayout(self.groupe_layout) + self.layout.addWidget(self.groupe) + + self.valide0=QPushButton("Envoi {}".format(self.vsn0.nom)) + self.valide0.clicked.connect(self.envoi0) + self.groupe_layout.addWidget(self.valide0) + + self.valide1=QPushButton("Envoi {}".format(self.vsn1.nom)) + self.valide1.clicked.connect(self.envoi1) + self.groupe_layout.addWidget(self.valide1) + + def envoi0(self): + txt=self.redac.text() + txt0=self.vsn0.texto.text() + self.vsn0.texto.setText(txt0+"\n"+txt) + + def envoi1(self): + txt=self.redac.text() + txt0=self.vsn1.texto.text() + self.vsn1.texto.setText(txt0+"\n"+txt) + +def ctrlfenChat(): + # Premiere etape : creation d'une application Qt avec QApplication + # afin d'avoir un fonctionnement correct avec IDLE ou Canopy + # on verifie s'il existe deja une instance de QApplication + app = QApplication.instance() + if not app: # sinon on cree une instance de QApplication + app = QApplication(sys.argv) + # creation d'une fenetre avec QWidget dont on place la reference dans fen + c0=Chat0();fenAlice=Chat("",c0,c0);fenEve=Chat("",c0,c0);fenBob=Chat("",c0,c0);fenAlice=Chat("Alice",fenBob,fenEve);fenBob=Chat("Bob",fenEve,fenAlice);fenEve=Chat("Ève",fenAlice,fenBob);fenAlice=Chat("Alice",fenBob,fenEve);fenBob=Chat("Bob",fenEve,fenAlice);fenEve=Chat("Ève",fenAlice,fenBob) + # la fenetre est rendue visible + fenAlice.show();fenBob.show();fenEve.show() + # execution de l'application, l'execution permet de gerer les evenements + app.exec_() +#ctrlfenChat() + +class ChatOrigin(QWidget): + def __init__(self,titre,Voisin0,Voisin1): + QWidget.__init__(self) + self.Voisin0=Voisin0 + self.Voisin1=Voisin1 + self.titre=titre + + self.setWindowTitle(self.titre) + self.resize(250,250) + self.layout=QVBoxLayout() + self.setLayout(self.layout) + + self.lu=QLabel("Lis ici") + self.layout.addWidget(self.lu) + + self.ecrit=QLineEdit("Tape ici.") + self.layout.addWidget(self.ecrit) + + self.groupe=QGroupBox("Boîte à bouttons") + self.groupe_layout=QVBoxLayout(self.groupe) + self.setLayout(self.groupe_layout) + self.layout.addWidget(self.groupe) + + self.envoyer0=QPushButton("Envoie à 0") + self.envoyer0.clicked.connect(self.Voisin0) + self.groupe_layout.addWidget(self.envoyer0) + + self.envoyer1=QPushButton("Envoie à 1") + self.envoyer1.clicked.connect(self.Voisin1) + self.groupe_layout.addWidget(self.envoyer1) + + def envoi0(self): + recu=self.Voisin0.lu.text() + emis=self.ecrit.text() + self.Voisin0.lu.setText("{}\n{}".format(recu,emis)) + + def envoi1(self): + recu=self.Voisin1.lu.text() + emis=self.ecrit.text() + self.Voisin1.lu.setText("{}\n{}".format(recu,emis)) + +class Alice(ChatOrigin): + def __init__(self): + ChatOrigin.__init__(self) + +def ctrlChatO(): + app = QApplication.instance() + if not app : + app = QApplication(sys.argv) + fen=ChatOrigin() + fen.show() + app.exec_() +ctrlChatO() +""" +Animation - Corpuscules dans une boîte +""" + +def pointsBoite(vitesse=1,N=5): + plt.plot([0,0,40,40,0],[0,40,40,0,0]) + v=np.zeros([2,N]) + r0=np.ones([2,N])*20 + for i in range(N): + theta=np.random.rand()*2*np.pi + v[0,i]=vitesse*np.cos(theta) + v[1,i]=vitesse*np.sin(theta) + for t in range(80):# Nombre d'itérations. + r=t*v+r0 + for p in range(2): + for q in range(N): + r[p,q]=r[p,q]%40 + if t == 0: + line, = plt.plot(r[0],r[1],"o",lw=3) + else: + line.set_xdata(r[0]) + line.set_ydata(r[1]) + plt.title("Temps : {}/{}".format(t,80-1)) + plt.pause(0.0005) # pause avec duree en secondes + plt.show() +#pointsBoite(2,5) +""" +Animation d'orbite élliptique. +""" +def rellipse(t,e=1,omega=2*np.pi/10): + return np.array([np.cos(omega*t),np.sin(omega*t)/e]) +def orbite(e=1,omega=2*np.pi/10): + T=np.linspace(0,1000,1001) + R=rellipse(T,e,2*np.pi/1000) + plt.plot(R[0],R[1],lw=2) + for t in range(101): + r=rellipse(t,e,omega) + if t == 0: + line, = plt.plot(r[0],r[1],"o",lw=10) + else: + line.set_xdata(r[0]) + line.set_ydata(r[1]) + plt.title("Temps : {}/{}".format(t,101-1)) + plt.pause(0.00005) # pause avec duree en secondes + plt.show() +#orbite(2,2*np.pi/40) \ No newline at end of file diff --git a/PyQt/Exam/examen_python_2015-2016_session_1.pdf b/PyQt/Exam/examen_python_2015-2016_session_1.pdf new file mode 100644 index 0000000000000000000000000000000000000000..b98a8bef53427b7296b84e3db169d72026c7463a GIT binary patch literal 34157 zcmce;bDSj2wl3VZd)lhDZQJ%t+qS1|o71*!+t##g+nDLw^X`4_+55Zi!CznfswyM1 zG9zL!B37)YNEJlHXc_5P;YoM*rsv^dIGF(q09ykKcpe^l8FL$BeFt-QVAl=_LS~02U4g023pJHXk3nv5nE6Y5@Pw z3m%4%f%88b5ivHjH8NJvcd&N+Y*N_P%Guh+5x_#P;9zWIZs=s|0AOU|X>Nib9VLMZ^f-UJdgp&-zU03=JI&>C>$Vu3)2j0Lc{ zTsRWUUBAF<9)NvMfL~bL4!lI9U)p!vGIMN-8QZ1`qSe`A=Rmar`H*g#nC=oPWzo03*w%i2p$@BNNM~lo=VA>6HPj zpS=GUI`s7P4E6LZ4E6N&X4WTq#(jZ0;A8|8(IKLP2XQbl*%(G>xAlOS{d_b12&thZ z?tmHjzmjD6rTjVsdBpV~mi!&QzMn9MOpf5fU^mA8p=S?7y$xjX9j*Y&?-(cc&`58j z6?&&$q>uJMU(d`FQS|^8Ne`&+8hz_;X#PtC|Dmb+Hl`H6KY+x5lz?ded{ffP>N{Be zk>#gS{V9Ixu#&z{vjBxq`l_v5fwATW2SF zc^l(@C?x%#i;e(J#(zltvnE3)6$fMEzjT55ANBmD0>YmaTiKfar~Y%Y{tNqUZJdm4 zoE$Yd|7r=q`A0NL0M0+wp!C_Dzv}rs{?*Fo@h>I(JpM7sKfnK_bK3O64z_kewr-jX zbe|7=epoqK>6n=S94w4Wzq<6t{64$>=OUBtpR0dpQleK;`BVM}(^OO#|LE2~uYc-4(?3|HqQd-H z{)>Rm`&mBA|M4vAXZf#Z`95EtM&B4<-d6Qk3Kqno~!5^IMOTs!@m9q;a@n* z_SxD$<^MO{LCoC2(FwrF%J6^HnvIR|(_t}k{G&2?0}Ev*>wnem^KWOiYivj#>d&>k zNTCJKC<?z5s&tuhL-8$jb;#?@#UAabHNKUH0^F!VmlXSgv}BzrUZj zq5CsW1tQ6OnUOHbC3i@Mg|9Tgeg%2ekTQd3ZVg&wGPPT093?$Plab2*5u0&91*uB; z)rMunH_O3Hd`!%|1BBI3Otip}n{x<1*bx^u zUZ!^PGP@ZgHy*z?P5E00Ykh{PsWI($3exGR;=MOC<&_tMEixi#Z!)dh4ebzH^^!v8SkG zq_*j~gOQ0k^r1VRF((i+RgXZ-ub33RncVWFiH0VRELF*^%y)4>1Od+<}74XeKj)I;

1(no}MBC@rnnD2%{HZ(#e<6z_UV_z}@*J3Xe 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

hR#ROwaDr@WOk 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 E57?ikL;wH) literal 0 HcmV?d00001 diff --git a/PyQt/bidule.py b/PyQt/bidule.py new file mode 100644 index 0000000..7983bbc --- /dev/null +++ b/PyQt/bidule.py @@ -0,0 +1,86 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- +""" +Created on Thu Jul 6 14:02:21 2017 + +@author: fh +""" +import numpy as np +import sys +from PyQt5.QtWidgets import QApplication, QWidget, QPushButton, QVBoxLayout, QGridLayout, QLabel, QLineEdit, QCheckBox, QGroupBox +from PyQt5.QtCore import Qt +from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvas +from matplotlib.figure import Figure +import matplotlib.pyplot as plt +class Bidule(QWidget): + def __init__(self): + QWidget.__init__(self) + self.setWindowTitle("Le bidule")#Titre de boîte + self.resize(250,250)#Taille de boîte + self.boite=QVBoxLayout()#Boîte verticale + self.fig = Figure()#Créer une figure. + self.axes1 = self.fig.add_subplot(121)#Figure1 + self.axes2=self.fig.add_subplot(122)#Figure2 + self.x1=np.linspace(-np.pi,np.pi) + self.x2=np.linspace(1,100) + self.y1=np.cos(self.x1)**2-np.sin(self.x1) + self.y2=np.exp(-self.x2**2) + self.line1,=self.axes1.plot(self.x1,self.y1) + self.line2,=self.axes2.plot(self.x2,self.y2) + self.canvas=FigureCanvas(self.fig)#Toile portant la figure de Matplotlib. + self.layout.addWidget(self.canvas) + self.setLayout(self.boite)#Placer boîte + self.soustitre=QLabel("Boîte à bouttons")#Sous-titre de sous-boîte + self.soustitre.setMaximumSize(200,15)#Taille de sous-titre + self.boite.addWidget(self.soustitre)#Placer sous-titre + self.sousboite=QGridLayout()#Sous-boîte en matrice pour les bouttons + self.boite.addLayout(self.sousboite)#Placer sous-boîte + self.bouttons=[]#Liste des bouttons vide + self.numeros=[]#Liste des numéros vide + self.appuyer=[] + for l in range(5): + self.bouttons+=[[]]#Lignes de bouttons + self.numeros+=[[]]#Lignes de numéros + self.appuyer+=[[]] + for c in range(5): + self.bouttons[l]+=[QPushButton()]#Colonnes de bouttons + self.numeros[l]+=["{}{}".format(l,c)]#Colonnes de numéros + self.appuyer[l]+=[np.sin] + self.bouttons[l][c].setMaximumSize(30,30)#Taille des bouttons + self.bouttons[l][c].setText(self.numeros[l][c])#Numéros des bouttons + self.sousboite.addWidget(self.bouttons[l][c],l,c)#Placer tous les bouttons + def appui(): + if self.bouttons[l][c].clicked!=QPushButton.clicked: + if self.numeros[l][c] == self.bouttons[l][c].text(): + self.bouttons[l][c].setText("["+self.numeros[l][c]+"]") + else: + self.bouttons[l][c].setText(self.numeros[l][c]) + self.appuyer[l][c]=appui + self.bouttons[l][c].clicked.connect(self.appuyer[l][c])#Connection entre bouttons et "appuyer" + self.show()#Afficher. +''' + def appuyer(self): + n=self.numeros + t=[] + for l in range(len(self.bouttons)): + t+=[[]] + for c in range(len(self.bouttons[0])): + t[l]+=[self.bouttons[l][c].text()] + for l in range(len(self.bouttons)): + for c in range(len(self.bouttons[0])): + if self.bouttons[l][c].clicked==QPushButton.clicked: + if n[l][c]==t[l][c]: + self.bouttons[l][c].setText("["+n[l][c]+"]") + else: + self.bouttons[l][c].setText(n[l][c]) +''' + + +def ouvrirBidule(): + app = QApplication.instance() + if not app: + app = QApplication(sys.argv) + objet = Bidule() + objet.show() + app.exec_() +ouvrirBidule() \ No newline at end of file diff --git a/PyQt/core.py b/PyQt/core.py new file mode 100644 index 0000000..813bf58 --- /dev/null +++ b/PyQt/core.py @@ -0,0 +1,34 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- +""" +Created on Fri Jun 22 15:25:01 2018 + +@author: fh +""" + +from PyQt5.QtWidgets import QWidget, QApplication, QGridLayout, QPushButton + +class Fenestre(QWidget):# Fenêtre finale affichée. + def __init__(self):# Constructeur. + QWidget.__init__(self)# Import des propriétés de QWidget. + self.setWindowTitle("Cases Voisines")# Insertion de titre de fenêtre. + self.resize(200, 200)#Taille de la fenêtre : x et y. + self.layout = QGridLayout()# Grille de bouttons. + self.layout.setColumnStretch(80, 80) + self.layout.setRowStretch(80, 80) + for i in range(5):# Par lignes. + for j in range(5):# Par colonnes. + self.buttonCase = QPushButton("x")# Nouveau boutton. + self.buttonCase.setMaximumSize(40, 40)# Dimensions du boutton. + self.layout.addWidget(self.buttonCase, i, j)# Insertion du boutton. + self.setLayout(self.layout)# Insertion de la grille. + self.showNormal()# Afficher. + +def execution():# Exécuter une fois. + import sys + app = QApplication.instance() + if not app: + app = QApplication(sys.argv) + fen = Fenestre() + fen.show() + app.exec_() \ No newline at end of file diff --git a/PyQt/requirements.txt b/PyQt/requirements.txt new file mode 100644 index 0000000..5cea11c --- /dev/null +++ b/PyQt/requirements.txt @@ -0,0 +1,13 @@ +cycler==0.11.0 +fonttools==4.34.4 +kiwisolver==1.4.4 +matplotlib==3.5.2 +numpy==1.23.1 +packaging==21.3 +Pillow==9.2.0 +pyparsing==3.0.9 +PyQt5==5.15.7 +PyQt5-Qt5==5.15.2 +PyQt5-sip==12.11.0 +python-dateutil==2.8.2 +six==1.16.0