.. This File is autogenerated. Do not edit.

PyQtInstallation
==========================

.. code:: python

    #!/usr/bin/env python3
    # This example shows how to install Minecraft with a ProgressBar in PyQt
    from PyQt6.QtWidgets import QApplication, QWidget, QLabel, QComboBox, QLineEdit, QPushButton, QProgressBar, QFileDialog, QFormLayout, QHBoxLayout, QVBoxLayout
    from PyQt6.QtCore import QThread, pyqtSignal
    import minecraft_launcher_lib
    import sys
    
    
    class InstallThread(QThread):
        progress_max = pyqtSignal("int")
        progress = pyqtSignal("int")
        text = pyqtSignal("QString")
    
        def __init__(self) -> None:
            QThread.__init__(self)
            self._callback_dict = {
                "setStatus": lambda text: self.text.emit(text),
                "setMax": lambda max_progress: self.progress_max.emit(max_progress),
                "setProgress": lambda progress: self.progress.emit(progress),
            }
    
        def set_data(self, version: str, directory) -> None:
            self._version = version
            self._directory = directory
    
        def run(self) -> None:
            minecraft_launcher_lib.install.install_minecraft_version(self._version, self._directory, callback=self._callback_dict)
    
    
    class Window(QWidget):
        def __init__(self) -> None:
            super().__init__()
    
            self._install_thread = InstallThread()
    
            self._version_combo_box = QComboBox()
            self._path_edit = QLineEdit()
            self._path_browse_button = QPushButton("Browse")
            self._progress_bar = QProgressBar()
            self._install_single_thread_button = QPushButton("Install Single Thread")
            self._install_multi_thread_button = QPushButton("Install Multi Thread")
    
            for i in minecraft_launcher_lib.utils.get_version_list():
                self._version_combo_box.addItem(i["id"])
    
            self._path_edit.setText(minecraft_launcher_lib.utils.get_minecraft_directory())
    
            self._progress_bar.setTextVisible(True)
    
            self._install_thread.progress_max.connect(lambda maximum: self._progress_bar.setMaximum(maximum))
            self._install_thread.progress.connect(lambda value: self._progress_bar.setValue(value))
            self._install_thread.text.connect(lambda text: self._progress_bar.setFormat(text))
            self._install_thread.finished.connect(self._install_thread_finished)
    
            self._path_browse_button.clicked.connect(self._path_browse_button_clicked)
            self._install_single_thread_button.clicked.connect(self._install_minecraft_single_thread)
            self._install_multi_thread_button.clicked.connect(self._install_minecraft_multi_thread)
    
            path_layout = QHBoxLayout()
            path_layout.addWidget(self._path_edit)
            path_layout.addWidget(self._path_browse_button)
    
            form_layout = QFormLayout()
            form_layout.addRow(QLabel("Version:"), self._version_combo_box)
            form_layout.addRow(QLabel("Path:"), path_layout)
    
            button_layout = QHBoxLayout()
            button_layout.addWidget(self._install_single_thread_button)
            button_layout.addWidget(self._install_multi_thread_button)
    
            main_layout = QVBoxLayout()
            main_layout.addLayout(form_layout)
            main_layout.addWidget(self._progress_bar)
            main_layout.addLayout(button_layout)
    
            self.setLayout(main_layout)
            self.setWindowTitle("PyQtInstallation")
    
        def _install_thread_finished(self) -> None:
            # This function is called after the Multi Thread Installation has been finished
            self._install_single_thread_button.setEnabled(True)
            self._install_multi_thread_button.setEnabled(True)
    
        def _path_browse_button_clicked(self) -> None:
            path = QFileDialog.getExistingDirectory(self, directory=self._path_edit.text())
            if path != "":
                self._path_edit.setText(path)
    
        def _install_minecraft_single_thread(self) -> None:
            # This function installs Minecraft in the same Thread as the GUI
            # This is much simpler than using a other Thread, but the GUI will freeze until the function is completed
            callback = {
                "setStatus": lambda text: self._progress_bar.setFormat(text),
                "setProgress": lambda value: self._progress_bar.setValue(value),
                "setMax": lambda maximum: self._progress_bar.setMaximum(maximum)
            }
    
            minecraft_launcher_lib.install.install_minecraft_version(self._version_combo_box.currentText(), self._path_edit.text(), callback=callback)
    
        def _install_minecraft_multi_thread(self) -> None:
            # This functions installs Minecraft on a other Thread than the GUI
            # This is more complex than using the same Thread, but the GUI will not freeze
            self._install_single_thread_button.setEnabled(False)
            self._install_multi_thread_button.setEnabled(False)
    
            self._install_thread.set_data(self._version_combo_box.currentText(), self._path_edit.text())
            self._install_thread.start()
    
    
    def main():
        app = QApplication(sys.argv)
    
        w = Window()
        w.show()
    
        sys.exit(app.exec())
    
    
    if __name__ == "__main__":
        main()


:repolink:`View this example on Codeberg <examples/PyQtInstallation.py>`