Initial commit

This commit is contained in:
2025-07-04 19:26:39 +02:00
commit c8682d4801
248 changed files with 12519 additions and 0 deletions

View File

View File

@ -0,0 +1,69 @@
import sys
from PySide6.QtGui import QIcon
from PySide6.QtWidgets import QApplication, QPushButton, QVBoxLayout, QMenuBar, QMenu, QAction, \
QMainWindow, QWidget
class Window(QMainWindow):
"""
Classe définissant notre fenêtre principale.
"""
def __init__(self, parent=None):
"""
Initialiser chaque nouvelle instance de notre fenêtre.
Args:
parent: Widget qui va contenir notre boîte de dialogue.
"""
super().__init__(parent=parent)
self.setWindowTitle("Ma nouvelle fenêtre")
# Create widgets
self.icon = QIcon.fromTheme("scanner")
self.basewidget = QWidget(self)
self.edit = QLineEdit("Zone de texte")
self.button = QPushButton("Appuyez ici !")
self.menubar = QMenuBar(self)
self.menu = QMenu(self.menubar, title="Élément de menu principal")
self.menuentry = QAction(QIcon.fromTheme("network-wired"), "&Action")
self.menu.addAction(self.menuentry)
self.menubar.addAction(self.menu.menuAction())
# Insérer un objet de mise en page dans notre fenêtre,
# et y ajouter nos champ de texte et bouton
self.setCentralWidget(self.basewidget)
layout = QVBoxLayout(self)
self.basewidget.setLayout(layout)
self.setMenuBar(self.menubar)
layout.addWidget(self.edit)
layout.addWidget(self.button)
self.setMinimumSize(640, 128)
# Connecter le clic du bouton à la méthode "validate_button"
self.button.clicked.connect(self.validate_button)
def validate_button(self):
"""
On définit cette méthode pour répondre au clic sur un bouton.
Il faut que l'on configure notre bouton pour que lorsqu'on clique
dessus, cette méthode soit exécutée.
"""
print(f"Vous avez saisi {self.edit.text()}")
if __name__ == "__main__":
# Créer une instance qui définit une application Qt
# Via la variable "sys.argv", qui correspond aux arguments passés en ligne de commande
# dans une liste de chaînes (ex. python programme.py arg1 arg2 arg3)
# on peut configurer le comportement de notre application...
# Également : notre application est un Singleton
application = QApplication(sys.argv)
# Ajouter notre boîte de dialogue
window = Window()
window.show()
# Lancer la boucle Qt, qui ferme le programme quand on ferme toutes les fenêtres
application.exec_()
sys.exit()

View File

@ -0,0 +1,27 @@
import sys
from PySide6.QtCore import QFile, QObject
QObject
# Exemple avec QT Designer
if __name__ == "__main__":
# Créer une instance qui définit une application Qt
# Via la variable "sys.argv", qui correspond aux arguments en ligne de commande
# on peut configurer le comportement de notre application...
# Également : notre application est un Singleton
application = QApplication(sys.argv)
# Utiliser Qt pour ouvrir le fichier Qt Designer qu'on a créé
file = QFile("files/base-ui.ui")
file.open(QFile.ReadOnly)
# Utiliser une classe de Qt qui est capable de créer des interfaces depuis des fichiers
loader = QUiLoader()
window = loader.load(file)
file.close()
# Ici on teste que l'on a bien accès aux variables membres du fichier qu'on a chargé
window.lineEdit: QLineEdit = window.lineEdit
window.lineEdit.setText("Bonjour les amis")
# Afficher notre fenêtre chargée
window.show()
# Lancer la boucle Qt, qui ferme le programme quand on ferme toutes les fenêtres
sys.exit(application.exec_())

View File

@ -0,0 +1,34 @@
import sys
from PySide2.QtWidgets import QDialog, QApplication
class Dialog(QDialog):
"""
Classe définissant notre fenêtre principale.
"""
def __init__(self, parent=None):
"""
Initialiser chaque nouvelle instance de notre fenêtre.
Args:
parent: Widget qui va contenir notre boîte de dialogue.
"""
super().__init__(parent=parent)
self.setWindowTitle("Ma nouvelle fenêtre")
if __name__ == "__main__":
# Créer une instance qui définit une application Qt
# Via la variable "sys.argv", qui correspond aux arguments en ligne de commande
# on peut configurer le comportement de notre application...
# Également : notre application est un Singleton
application = QApplication(sys.argv)
# Ajouter notre boîte de dialogue
dialog = Dialog()
dialog.show()
# Lancer la boucle Qt, qui ferme le programme quand on ferme toutes les fenêtres
sys.exit(application.exec_())

View File

@ -0,0 +1,91 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>MainWindow</class>
<widget class="QMainWindow" name="MainWindow">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>575</width>
<height>317</height>
</rect>
</property>
<property name="windowTitle">
<string>MainWindow</string>
</property>
<widget class="QWidget" name="centralwidget">
<layout class="QGridLayout" name="gridLayout">
<item row="0" column="0">
<layout class="QVBoxLayout" name="verticalLayout">
<property name="sizeConstraint">
<enum>QLayout::SetMinimumSize</enum>
</property>
<item>
<widget class="QLineEdit" name="lineEdit"/>
</item>
<item>
<widget class="QPushButton" name="pushButton">
<property name="text">
<string>PushButton</string>
</property>
</widget>
</item>
<item>
<widget class="QLineEdit" name="lineEdit_2"/>
</item>
</layout>
</item>
</layout>
</widget>
<widget class="QMenuBar" name="menubar">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>575</width>
<height>31</height>
</rect>
</property>
<widget class="QMenu" name="menuMenu_principal">
<property name="title">
<string>Menu principal</string>
</property>
<addaction name="actionAction_1"/>
<addaction name="actionAction_2"/>
<addaction name="separator"/>
<addaction name="actionAction_3"/>
</widget>
<addaction name="menuMenu_principal"/>
</widget>
<widget class="QStatusBar" name="statusbar"/>
<action name="actionAction_1">
<property name="icon">
<iconset theme="input-tablet">
<normaloff>.</normaloff>.</iconset>
</property>
<property name="text">
<string>Action 1</string>
</property>
</action>
<action name="actionAction_2">
<property name="icon">
<iconset theme="network-wired">
<normaloff>.</normaloff>.</iconset>
</property>
<property name="text">
<string>Action 2</string>
</property>
</action>
<action name="actionAction_3">
<property name="icon">
<iconset theme="scanner">
<normaloff>.</normaloff>.</iconset>
</property>
<property name="text">
<string>Action 3</string>
</property>
</action>
</widget>
<resources/>
<connections/>
</ui>

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

View File

@ -0,0 +1,22 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>Window</class>
<widget class="QMainWindow" name="Window">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>800</width>
<height>600</height>
</rect>
</property>
<property name="windowTitle">
<string>Window</string>
</property>
<widget class="QWidget" name="centralwidget"/>
<widget class="QMenuBar" name="menubar"/>
<widget class="QStatusBar" name="statusbar"/>
</widget>
<resources/>
<connections/>
</ui>

View File

@ -0,0 +1,28 @@
# This Python file uses the following encoding: utf-8
import sys
import os
from PySide2.QtWidgets import QApplication, QMainWindow
from PySide2.QtCore import QFile
from PySide2.QtUiTools import QUiLoader
class Window(QMainWindow):
def __init__(self):
super(Window, self).__init__()
self.load_ui()
def load_ui(self):
loader = QUiLoader()
path = os.path.join(os.path.dirname(__file__), "form.ui")
ui_file = QFile(path)
ui_file.open(QFile.ReadOnly)
loader.load(ui_file, self)
ui_file.close()
if __name__ == "__main__":
app = QApplication([])
widget = Window()
widget.show()
sys.exit(app.exec_())

View File

@ -0,0 +1,3 @@
{
"files": ["main.py", "form.ui"]
}

View File

@ -0,0 +1,196 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE QtCreatorProject>
<!-- Written by QtCreator 4.14.0, 2021-02-25T10:34:49. -->
<qtcreator>
<data>
<variable>EnvironmentId</variable>
<value type="QByteArray">{f52a1091-6a1a-4c8e-9bfd-fca585155f33}</value>
</data>
<data>
<variable>ProjectExplorer.Project.ActiveTarget</variable>
<value type="int">0</value>
</data>
<data>
<variable>ProjectExplorer.Project.EditorSettings</variable>
<valuemap type="QVariantMap">
<value type="bool" key="EditorConfiguration.AutoIndent">true</value>
<value type="bool" key="EditorConfiguration.AutoSpacesForTabs">false</value>
<value type="bool" key="EditorConfiguration.CamelCaseNavigation">true</value>
<valuemap type="QVariantMap" key="EditorConfiguration.CodeStyle.0">
<value type="QString" key="language">Cpp</value>
<valuemap type="QVariantMap" key="value">
<value type="QByteArray" key="CurrentPreferences">CppGlobal</value>
</valuemap>
</valuemap>
<valuemap type="QVariantMap" key="EditorConfiguration.CodeStyle.1">
<value type="QString" key="language">QmlJS</value>
<valuemap type="QVariantMap" key="value">
<value type="QByteArray" key="CurrentPreferences">QmlJSGlobal</value>
</valuemap>
</valuemap>
<value type="int" key="EditorConfiguration.CodeStyle.Count">2</value>
<value type="QByteArray" key="EditorConfiguration.Codec">UTF-8</value>
<value type="bool" key="EditorConfiguration.ConstrainTooltips">false</value>
<value type="int" key="EditorConfiguration.IndentSize">4</value>
<value type="bool" key="EditorConfiguration.KeyboardTooltips">false</value>
<value type="int" key="EditorConfiguration.MarginColumn">80</value>
<value type="bool" key="EditorConfiguration.MouseHiding">true</value>
<value type="bool" key="EditorConfiguration.MouseNavigation">true</value>
<value type="int" key="EditorConfiguration.PaddingMode">1</value>
<value type="bool" key="EditorConfiguration.ScrollWheelZooming">true</value>
<value type="bool" key="EditorConfiguration.ShowMargin">false</value>
<value type="int" key="EditorConfiguration.SmartBackspaceBehavior">0</value>
<value type="bool" key="EditorConfiguration.SmartSelectionChanging">true</value>
<value type="bool" key="EditorConfiguration.SpacesForTabs">true</value>
<value type="int" key="EditorConfiguration.TabKeyBehavior">0</value>
<value type="int" key="EditorConfiguration.TabSize">8</value>
<value type="bool" key="EditorConfiguration.UseGlobal">true</value>
<value type="int" key="EditorConfiguration.Utf8BomBehavior">1</value>
<value type="bool" key="EditorConfiguration.addFinalNewLine">true</value>
<value type="bool" key="EditorConfiguration.cleanIndentation">true</value>
<value type="bool" key="EditorConfiguration.cleanWhitespace">true</value>
<value type="QString" key="EditorConfiguration.ignoreFileTypes">*.md, *.MD, Makefile</value>
<value type="bool" key="EditorConfiguration.inEntireDocument">false</value>
<value type="bool" key="EditorConfiguration.skipTrailingWhitespace">true</value>
</valuemap>
</data>
<data>
<variable>ProjectExplorer.Project.PluginSettings</variable>
<valuemap type="QVariantMap">
<valuemap type="QVariantMap" key="AutoTest.ActiveFrameworks">
<value type="bool" key="AutoTest.Framework.Boost">true</value>
<value type="bool" key="AutoTest.Framework.Catch">true</value>
<value type="bool" key="AutoTest.Framework.GTest">true</value>
<value type="bool" key="AutoTest.Framework.QtQuickTest">true</value>
<value type="bool" key="AutoTest.Framework.QtTest">true</value>
</valuemap>
<valuemap type="QVariantMap" key="AutoTest.CheckStates"/>
<value type="int" key="AutoTest.RunAfterBuild">0</value>
<value type="bool" key="AutoTest.UseGlobal">true</value>
<valuelist type="QVariantList" key="ClangCodeModel.CustomCommandLineKey"/>
<value type="bool" key="ClangCodeModel.UseGlobalConfig">true</value>
<value type="QString" key="ClangCodeModel.WarningConfigId">Builtin.Questionable</value>
<valuemap type="QVariantMap" key="ClangTools">
<value type="bool" key="ClangTools.AnalyzeOpenFiles">true</value>
<value type="bool" key="ClangTools.BuildBeforeAnalysis">true</value>
<value type="QString" key="ClangTools.DiagnosticConfig">Builtin.DefaultTidyAndClazy</value>
<value type="int" key="ClangTools.ParallelJobs">6</value>
<valuelist type="QVariantList" key="ClangTools.SelectedDirs"/>
<valuelist type="QVariantList" key="ClangTools.SelectedFiles"/>
<valuelist type="QVariantList" key="ClangTools.SuppressedDiagnostics"/>
<value type="bool" key="ClangTools.UseGlobalSettings">true</value>
</valuemap>
</valuemap>
</data>
<data>
<variable>ProjectExplorer.Project.Target.0</variable>
<valuemap type="QVariantMap">
<value type="QString" key="DeviceType">Desktop</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Desktop</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Desktop</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">{d044ec2e-da82-4493-a678-1f0961b658b1}</value>
<value type="int" key="ProjectExplorer.Target.ActiveBuildConfiguration">-1</value>
<value type="int" key="ProjectExplorer.Target.ActiveDeployConfiguration">0</value>
<value type="int" key="ProjectExplorer.Target.ActiveRunConfiguration">0</value>
<value type="int" key="ProjectExplorer.Target.BuildConfigurationCount">0</value>
<valuemap type="QVariantMap" key="ProjectExplorer.Target.DeployConfiguration.0">
<valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0">
<value type="int" key="ProjectExplorer.BuildStepList.StepsCount">0</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Deploy</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Deploy</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Deploy</value>
</valuemap>
<value type="int" key="ProjectExplorer.BuildConfiguration.BuildStepListCount">1</value>
<valuemap type="QVariantMap" key="ProjectExplorer.DeployConfiguration.CustomData"/>
<value type="bool" key="ProjectExplorer.DeployConfiguration.CustomDataEnabled">false</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.DefaultDeployConfiguration</value>
</valuemap>
<value type="int" key="ProjectExplorer.Target.DeployConfigurationCount">1</value>
<valuemap type="QVariantMap" key="ProjectExplorer.Target.RunConfiguration.0">
<value type="QString" key="Analyzer.Perf.CallgraphMode">dwarf</value>
<valuelist type="QVariantList" key="Analyzer.Perf.Events">
<value type="QString">cpu-cycles</value>
</valuelist>
<valuelist type="QVariantList" key="Analyzer.Perf.ExtraArguments"/>
<value type="int" key="Analyzer.Perf.Frequency">250</value>
<valuelist type="QVariantList" key="Analyzer.Perf.RecordArguments">
<value type="QString">-e</value>
<value type="QString">cpu-cycles</value>
<value type="QString">--call-graph</value>
<value type="QString">dwarf,4096</value>
<value type="QString">-F</value>
<value type="QString">250</value>
</valuelist>
<value type="QString" key="Analyzer.Perf.SampleMode">-F</value>
<value type="bool" key="Analyzer.Perf.Settings.UseGlobalSettings">true</value>
<value type="int" key="Analyzer.Perf.StackSize">4096</value>
<value type="bool" key="Analyzer.QmlProfiler.AggregateTraces">false</value>
<value type="bool" key="Analyzer.QmlProfiler.FlushEnabled">false</value>
<value type="uint" key="Analyzer.QmlProfiler.FlushInterval">1000</value>
<value type="QString" key="Analyzer.QmlProfiler.LastTraceFile"></value>
<value type="bool" key="Analyzer.QmlProfiler.Settings.UseGlobalSettings">true</value>
<valuelist type="QVariantList" key="Analyzer.Valgrind.AddedSuppressionFiles"/>
<value type="bool" key="Analyzer.Valgrind.Callgrind.CollectBusEvents">false</value>
<value type="bool" key="Analyzer.Valgrind.Callgrind.CollectSystime">false</value>
<value type="bool" key="Analyzer.Valgrind.Callgrind.EnableBranchSim">false</value>
<value type="bool" key="Analyzer.Valgrind.Callgrind.EnableCacheSim">false</value>
<value type="bool" key="Analyzer.Valgrind.Callgrind.EnableEventToolTips">true</value>
<value type="double" key="Analyzer.Valgrind.Callgrind.MinimumCostRatio">0.01</value>
<value type="double" key="Analyzer.Valgrind.Callgrind.VisualisationMinimumCostRatio">10</value>
<value type="bool" key="Analyzer.Valgrind.FilterExternalIssues">true</value>
<value type="QString" key="Analyzer.Valgrind.KCachegrindExecutable">kcachegrind</value>
<value type="int" key="Analyzer.Valgrind.LeakCheckOnFinish">1</value>
<value type="int" key="Analyzer.Valgrind.NumCallers">25</value>
<valuelist type="QVariantList" key="Analyzer.Valgrind.RemovedSuppressionFiles"/>
<value type="int" key="Analyzer.Valgrind.SelfModifyingCodeDetection">1</value>
<value type="bool" key="Analyzer.Valgrind.Settings.UseGlobalSettings">true</value>
<value type="bool" key="Analyzer.Valgrind.ShowReachable">false</value>
<value type="bool" key="Analyzer.Valgrind.TrackOrigins">true</value>
<value type="QString" key="Analyzer.Valgrind.ValgrindExecutable">valgrind</value>
<valuelist type="QVariantList" key="Analyzer.Valgrind.VisibleErrorKinds">
<value type="int">0</value>
<value type="int">1</value>
<value type="int">2</value>
<value type="int">3</value>
<value type="int">4</value>
<value type="int">5</value>
<value type="int">6</value>
<value type="int">7</value>
<value type="int">8</value>
<value type="int">9</value>
<value type="int">10</value>
<value type="int">11</value>
<value type="int">12</value>
<value type="int">13</value>
<value type="int">14</value>
</valuelist>
<valuelist type="QVariantList" key="CustomOutputParsers"/>
<value type="int" key="PE.EnvironmentAspect.Base">2</value>
<valuelist type="QVariantList" key="PE.EnvironmentAspect.Changes"/>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">main</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">PythonEditor.RunConfiguration./home/steve/Code/python/initiation/source/gui/files/qtcreatordemo/basewindow/main.py</value>
<value type="QString" key="ProjectExplorer.RunConfiguration.BuildKey">/home/steve/Code/python/initiation/source/gui/files/qtcreatordemo/basewindow/main.py</value>
<value type="QString" key="PythonEditor.RunConfiguation.Interpreter">{9e6235fb-9067-40a7-be7d-a5b33f406c75}</value>
<value type="QString" key="PythonEditor.RunConfiguation.Script">/home/steve/Code/python/initiation/source/gui/files/qtcreatordemo/basewindow/main.py</value>
<value type="bool" key="RunConfiguration.UseCppDebugger">false</value>
<value type="bool" key="RunConfiguration.UseCppDebuggerAuto">true</value>
<value type="bool" key="RunConfiguration.UseQmlDebugger">false</value>
<value type="bool" key="RunConfiguration.UseQmlDebuggerAuto">true</value>
<value type="QString" key="RunConfiguration.WorkingDirectory.default">/home/steve/Code/python/initiation/source/gui/files/qtcreatordemo/basewindow</value>
</valuemap>
<value type="int" key="ProjectExplorer.Target.RunConfigurationCount">1</value>
</valuemap>
</data>
<data>
<variable>ProjectExplorer.Project.TargetCount</variable>
<value type="int">1</value>
</data>
<data>
<variable>ProjectExplorer.Project.Updater.FileVersion</variable>
<value type="int">22</value>
</data>
<data>
<variable>Version</variable>
<value type="int">22</value>
</data>
</qtcreator>

View File

@ -0,0 +1,20 @@
"""
Example code to select file using a file dialog.
Needs a Qt Application object and then a File dialog object.
The `getOpenFileName()` method on the file dialog object opens
a dialog for loading a single file. It returns a tuple, containing
the selected file name (str) and the filter (str).
If no file was selected (cancelled), you get empty strings in the tuple.
"""
from PySide6.QtWidgets import QFileDialog, QApplication
application = QApplication()
# You don't need application.exec() here because the method blocks the python script execution.
dialog = QFileDialog(directory="/home/steve", caption="Sélectionnez un fichier", filter="Text files (*.txt);; All files (*.*)")
selection: tuple[str, str] = dialog.getOpenFileName()
print(selection)
with open("/home/steve/Code/training/python/beginner/documentation/12-logging.md", "r") as file:
lines = file.readlines()
print(lines)

View File

@ -0,0 +1,86 @@
import sys
from PySide2.QtGui import QIcon
from PySide2.QtWidgets import QApplication, QLineEdit, QPushButton, QVBoxLayout, QAction, \
QMainWindow, QWidget
class Dialog(QMainWindow):
"""
Classe définissant notre fenêtre principale.
"""
def __init__(self, parent=None):
"""
Initialiser chaque nouvelle instance de notre fenêtre.
Args:
parent: Widget qui va contenir notre boîte de dialogue.
"""
super().__init__(parent=parent)
# Changer le titre de la fenêtre et changer la position et taille
self.setWindowTitle("Ma nouvelle fenêtre")
self.setGeometry(50, 50, 640, 480)
# Définir l'icône pour la fenêtre
self.setWindowIcon(QIcon.fromTheme("exit"))
# On crée manuellement des contrôles dans notre fenêtre et des menus
self.edit = QLineEdit("Zone de texte")
self.button = QPushButton("Appuyez ici !")
self.menuentry1 = QAction(QIcon.fromTheme("exit"), "&Fin")
self.menuentry2 = QAction(QIcon.fromTheme("sleep"), "&Dodo")
self.filemenu = self.menuBar().addMenu("&File")
self.filemenu.addAction(self.menuentry1)
self.filemenu.addSeparator()
self.filemenu.addAction(self.menuentry2)
# Insérer un objet de mise en page dans notre fenêtre,
# et y ajouter nos champ de texte et bouton
frame = QWidget()
layout = QVBoxLayout()
layout.addWidget(self.edit)
layout.addWidget(self.button)
# Ajouter la mise en page au widget
frame.setLayout(layout)
# Définir le widget comme le contenu de la fenêtre
self.setCentralWidget(frame)
# Connecter le clic du bouton à la méthode "validate_button"
self.button.clicked.connect(self.button_clicked)
# Connecter la validation du menu1 à la même méthode
self.menuentry1.triggered.connect(self.button_clicked)
# Connecter la modification du champ de texte à une méthode
self.edit.textEdited.connect(self.text_modified)
def button_clicked(self):
"""
On définit cette méthode pour répondre au clic sur un bouton.
Il faut que l'on configure notre bouton pour que lorsqu'on clique
dessus, cette méthode soit exécutée.
"""
print(f"Vous avez saisi {self.edit.text()}")
def text_modified(self):
"""
On définit cette méthode pour répondre à la modification du champ texte.
Cette méthode n'est pas spécifique à Qt, c'est juste qu'on peut lier
des événements de contrôles Qt à des fonctions arbitraires. Et on
va lier l'édition du champ de texte à cette méthode-ci.
"""
print(f"{self.edit.text()}")
if __name__ == "__main__":
# Créer une instance qui définit une application Qt
# Via la variable "sys.argv", qui correspond aux arguments en ligne de commande
# on peut configurer le comportement de notre application...
# Également : notre application est un Singleton
application = QApplication(sys.argv)
# Ajouter notre boîte de dialogue
dialog = Dialog()
dialog.show()
# Lancer la boucle Qt, qui ferme le programme quand on ferme toutes les fenêtres
sys.exit(application.exec_())