Membuat virtual environment
- Dalam kasus ini akan menggunakan Anaconda, buka anaconda prompt
- Cek virtual environment: conda env list
- Buat virtual environment baru, misal dengan nama pyqt6_app: conda create --name pyqt6_app python=3.10
- Aktifkan virtual environment: conda activate pyqt6_app
- Jika ingin keluar dari VE: conda deactivate
- Jika ingin menghapus VE: conda remove --name pyqt6_app --all
- Install PyQt
- install pyQt6: pip3 install pyqt6
- Membuat Aplikasi Pertama
- Buat folder kerja dengan nama pyqt6: mkdir pyqt6
- Di folder pyt6, buat file dengan nama myapp.py, kemudian masukan kode:
- from PyQt6.QtWidgets import QApplication, QWidget
- #Only needed for access to command line arguments
- import sys
- #You need one (and only one) QApplication instance per application.
- #Pass in sys.argv to allow command line arguments for your app.
- #If you know you wan't use command line arguments Application([]) works too.
- app = QApplication(sys.argv)
- #Create a Qt widget, which will be our window.
- window = QWidget()
- window.show() #IMPORTANT!!! window will hidden by default.
- #Start the event loop
- app.exec()
- #Your application won't reach here until you exit the event
- #loop has stoped.
- Jalankan aplikasi: python myapp.py
- Maka akan dihasilkan window kosong seperti pada gambar diatas. Penjelasan dari kode adalah
from PyQt6.QtWidgets import QApplication, QWidget
- Pertama kita import class PyQt6 yang dibutuhkan dalam aplikasi, yaitu import QApplication sebagai handler aplikasi, dan QWidget untuk tampilan widget kosong GUI dari modul QtWidgets.
- Ada beberapa modul utama untuk Qt yang biasa digunakan yaitu QtWidgets, QtGUI, dan QtCore.
app = QApplication(sys.argv)
- Selanjutnya buat instance dari QApplication, dengan passing perintah dalam sys.arg, yang berisi lisi perintah yang dikirim ke aplikasi. Jika kita tahu tidak akan kirim perintah maka bisa menusilkan app = QApplication([])
window = QWidget()
window.show()- Selanjutnya membuat intstance dari QWidget menggunakan variabel yang bernama window. Dalam Qt top level widgets adalah window, dimana tidak punya parent dan tidak nested dengan widget atau layout yang lain. Perintah .show() digunakan untuk menampilkan window invisible. Kalau perintah .show() tidak diberikan maka aplikasi akan jalan namun tidak bisa di close.
app.exec()
- Perintah untuk menjalankan event loop aplikasi.
- Contoh lain kode sederhana dengan mengganti QtWidget dengan QPushButton untuk menampilkan button sederhana. Kodenya adalah seperti ini:
import sys
from PyQt6.QtWidgets import QApplication, QPushButton
app = QApplication(sys.argv)
window = QPushButton("Tekan saya")
window.show()
app.exec()- Hasil dari kode diatas adalah tampilan window dengan satu buah button sederhana dengan tulisan "Tekan saya".
- Membuat Tampilan dengan MainWindow
- Dalam aplikasi kita tidak akan menggunakan hanya satu UI, maka diperlukan sebuah window yang dapat memuat beberapa kontor UI dalam tampilan window. Untuk masalah ini akan menggunakan QMainWindow merupakan sebuah widget yang dapat memuat fitur window lain seperti toolbar, menu, status bar, dockable widget dan lain sebagainya.
- Untuk melakukan hal ini pada bagian atas kode program import QMainWindow.
#main_window.py
#create by : wawanHN
import sys
from PyQt6.QtWidgets import QApplication, QMainWindow
app = QApplication(sys.argv)
window = QMainWindow()
window.show() #Window secara default tidak ditampilkan
app.exec()- Hasil dari kode diatas masih sama seperti pada Gambar 1, namun sebenarnya berbeda karena pada kode ini kita buat MainWindow yang akan bisa ditambahkan window widget-widget lain.
- Kita coba MainWindow dengan menambahkan button.
- Selanjutnya dengan MainWindow tambahkan button dan set ukuran window.
import sys
from PyQt6.QtCore import QSize, Qt
from PyQt6.QtWidgets import QApplication, QMainWindow, QPushButton
# Subclass QMainWindow to customize your application's main window
class MainWindow(QMainWindow):
def __init__(self):
super().__init__()
self.setWindowTitle("My App")
button = QPushButton("Klik saya!")
self.setFixedSize(QSize(400, 300))
# Set the central widget of the Window.
self.setCentralWidget(button)
app = QApplication(sys.argv)
window = MainWindow()
window.show()
app.exec()- Maka akan menghasilkan window dengan ukuran 400 x 300
- Signals dan Slots
- Sejauh ini dalam kode-kode sebelumnya sudah membuat aplikasi menampilkan button, namun button tresebut tidak melakukan apapun. Biasanya dalam sebuah aplikasi ketika kita menambahkan button pasti akan melakukan suatu aksi, misal jika button tersebut di klik, yang dalam Qt dihasilkan dari Signal dan Slots. Signals merupakan notifikasi yang disampaikan oleh widget ketika sesuatu dijalankan. Misal angka, text atau apaoun ketika misal button di klik. Dan Slots merupakan bagian dari Qt yang menerima signals, dalam Python semua fungsi atau method dapat dikategorikan sebagai slots. Dalam contoh kode ini akan dibuat windows yang berisi button yang melakukan sesuatu ketika di klik, yaitu menampilkan text di console.
- # signals_slots1.py
- import sys
- from PyQt6.QtWidgets import (
- QApplication,
- QMainWindow,
- QPushButton,
- )
- class MainWindow(QMainWindow):
- def __init__(self):
- super().__init__()
- self.setWindowTitle("My App")
- button = QPushButton("Tekan saya")
- button.setCheckable(True)
- button.clicked.connect(self.button_telah_diklik)
- #Set the central widget of the window.
- self.setCentralWidget(button)
- def button_telah_diklik(self):
- print("Telah di klik")
- app = QApplication(sys.argv)
- window = MainWindow()
- window.show()
- app.exec()
- Gunakan cls untuk membersihkan layar
- ketikan perintah: python signals_slots1.py
- Dari hasil kode yang dibuat akan menampilkan window yang terdiri dari sebuah button yang jika di kllik maka akan menampilkan tulisan "Telah di klik" di bagian console atau command prompt.
- Selanjutkan bagaimana kalau menambahkan fungsi atau method saat button diklik akan menampilkan teks "Telah diklik" dan akan memberikan informasi status apakah button dalam posisi checked True atau False setelah button di klik.
#signals_slots2.py
#created by wawanHN
import sys
from PyQt6.QtWidgets import (
QApplication,
QMainWindow,
QPushButton,
)
class MainWindow(QMainWindow):
def __init__(self):
super().__init__()
self.setWindowTitle("Aplikasi Signals Slot 2")
self.setFixedSize(300, 200)
button = QPushButton("Klik saya")
button.setCheckable(True)
button.clicked.connect(self.button_telah_diklik)
button.clicked.connect(self.button_telah_beralih)
#Set ditengah window
self.setCentralWidget(button)
def button_telah_diklik(self):
print("Telah di klik")
def button_telah_beralih(self, checked):
print("Status checked?" , checked)
app = QApplication(sys.argv)
window = MainWindow()
window.show()
app.exec()- Hasil di kode program tersebut adalah, dengan sebelumnya keikan perintah python signals_slots2.py di command prompt
- Atau dengan sedikit modifikasi kode program untuk mengasilkan seperti gambar diatas bisa juga dengan kode seperti ini
#signals_slots3.py
#created by wawanHN
import sys
from PyQt6.QtWidgets import (
QApplication,
QMainWindow,
QPushButton,
)
class MainWindow(QMainWindow):
def __init__(self):
super().__init__()
self.button_is_checked = True
self.setWindowTitle("Aplikasi Signals Slot 2")
self.setFixedSize(300, 200)
button = QPushButton("Klik saya")
button.setCheckable(True)
button.clicked.connect(self.button_telah_beralih)
button.setChecked(self.button_is_checked)
#Set ditengah window
self.setCentralWidget(button)
def button_telah_beralih(self, checked):
self.button_is_checked = checked
print("Status checked?" , checked)
app = QApplication(sys.argv)
window = MainWindow()
window.show()
app.exec()- Atau dengan memodifikasi kode program dengan menambahkan fungsi release button
#signals_slots4.py
#created by wawanHN
import sys
from PyQt6.QtWidgets import (
QApplication,
QMainWindow,
QPushButton,
)
class MainWindow(QMainWindow):
def __init__(self):
super().__init__()
self.button_is_checked = True
self.setWindowTitle("Aplikasi Signals Slot 2")
self.setFixedSize(300, 200)
self.button = QPushButton("Klik saya")
self.button.setCheckable(True)
self.button.released.connect(
self.button_telah_dilepas
)
self.button.setChecked(self.button_is_checked)
#Set ditengah window
self.setCentralWidget(self.button)
def button_telah_dilepas(self):
self.button_is_checked = self.button.isChecked()
print(self.button_is_checked)
app = QApplication(sys.argv)
window = MainWindow()
window.show()
app.exec()- Ketikan python signals_slots4.py
- Akan menghasilkan
- Selanjutnya akan melakukan fungsi sederhana untuk merubah judul window ketika button di klik
#signals_slots2.py
#created by wawanHN
import sys
from PyQt6.QtWidgets import (
QApplication,
QMainWindow,
QPushButton,
)
from random import choice
window_titles = [
"Aplikasiku",
"Aplikasiku",
"Masih Aplikasiku",
"Masih Aplikasiku",
"Apa yang terjadi",
"Apa yang terjadi",
"Sungguh Mengagetkan",
"Sungguh Mengagetkan",
"Terjadi Kesalahan",
]
class MainWindow(QMainWindow):
def __init__(self):
super().__init__()
self.n_times_clicked = 0
self.setWindowTitle("Aplikasi Signals Slot 2")
self.button = QPushButton("Klik saya")
self.button.clicked.connect(self.button_telah_diklik)
self.setFixedSize(300, 200)
self.windowTitleChanged.connect(
self.judul_window_telah_berubah
)
#Set ditengah window
self.setCentralWidget(self.button)
def button_telah_diklik(self):
print("Telah di klik.")
new_window_title = choice(window_titles)
print("Seting Judul: %s" % new_window_title)
self.setWindowTitle(new_window_title)
def judul_window_telah_berubah(self, window_title):
print("Judul window telah berubah: %s" %window_title)
if window_title == "Terjadi Kesalahan":
self.button.setDisabled(True)
app = QApplication(sys.argv)
window = MainWindow()
window.show()
app.exec()- Signals dan Slots selain membutuhkan fungsi untuk melakukan sesuatu, bisa juga menghubungkan antara widget tanpa membuat slots. Seperti contoh
#signals_slots6.py
#created by wawanHN
import sys
from PyQt6.QtWidgets import (
QApplication,
QMainWindow,
QLabel,
QLineEdit,
QVBoxLayout,
QWidget,
)
class MainWindow(QMainWindow):
def __init__(self):
super().__init__()
self.n_times_clicked = 0
self.setWindowTitle("My App")
self.label = QLabel()
self.input = QLineEdit()
self.input.textChanged.connect(self.label.setText)
self.setFixedSize(200, 200)
layout = QVBoxLayout()
layout.addWidget(self.input)
layout.addWidget(self.label)
container = QWidget()
container.setLayout(layout)
#Set ditengah window
self.setCentralWidget(container)
def button_telah_diklik(self):
print("Telah di klik.")
new_window_title = choice(window_titles)
print("Seting Judul: %s" % new_window_title)
self.setWindowTitle(new_window_title)
def judul_window_telah_berubah(self, window_title):
print("Judul window telah berubah: %s" %window_title)
if window_title == "Terjadi Kesalahan":
self.button.setDisabled(True)
app = QApplication(sys.argv)
window = MainWindow()
window.show()
app.exec()- Ketika python signals_slots6.py, maka akan dihasilkan
- Create GUI Application with Python and Qt6 5th edition
- https://www.pythonguis.com/topics/pyqt6/