
**Pendahuluan**
Dalam pengembangan aplikasi desktop, kemampuan untuk menampilkan beberapa window/form adalah kebutuhan fundamental. Artikel ini akan membahas cara membuat aplikasi PyQt5 dengan dua form terpisah, di mana form utama dapat membuka form kedua melalui interaksi tombol. Kode ini cocok untuk pemula yang ingin memahami manajemen multi-window dalam PyQt5.
---
### **Struktur Proyek**
1. **`main.py`** - File utama aplikasi
2. **`MainForm.py`** - Form utama dengan tombol
3. **`OtherForm.py`** - Form kedua yang akan ditampilkan
---
### **1. File main.py**
```python
#!/usr/bin/python3
import sys
from PyQt5.QtWidgets import QApplication
from MainForm import MainForm
if __name__ == '__main__':
app = QApplication(sys.argv)
main_window = MainForm()
main_window.show()
app.exec_()
```
**Penjelasan:**
- Membuat instance `QApplication` untuk mengelola alur aplikasi
- Menginisialisasi dan menampilkan form utama
- Memulai event loop dengan `app.exec_()`
---
### **2. File MainForm.py**
```python
from PyQt5.QtWidgets import QWidget, QPushButton
from OtherForm import OtherForm # Import form kedua
class MainForm(QWidget):
def __init__(self):
super().__init__()
self.initialize_ui()
def initialize_ui(self):
# Konfigurasi form utama
self.setGeometry(300, 300, 300, 200)
self.setWindowTitle('Form Utama')
# Membuat tombol
self.button = QPushButton('Buka Form Lain', self)
self.button.setGeometry(50, 50, 200, 40) # x, y, width, height
# Hubungkan sinyal klik ke fungsi
self.button.clicked.connect(self.open_other_form)
def open_other_form(self):
"""Membuat dan menampilkan form kedua"""
self.other_form = OtherForm()
self.other_form.show()
```
**Fitur Utama:**
- Menggunakan `setGeometry()` untuk menentukan posisi dan ukuran
- Tombol dengan ukuran spesifik (200x40 pixel)
- Sistem event handling dengan `clicked.connect()`
---
### **3. File OtherForm.py**
```python
from PyQt5.QtWidgets import QWidget, QLabel
class OtherForm(QWidget):
def __init__(self):
super().__init__()
self.setup_ui()
def setup_ui(self):
# Konfigurasi form kedua
self.setGeometry(400, 400, 250, 150)
self.setWindowTitle('Form Kedua')
# Tambahkan komponen
label = QLabel('Ini adalah Form Lain', self)
label.move(50, 50)
```
**Penjelasan:**
- Form independen yang diwarisi dari `QWidget`
- Menggunakan `QLabel` untuk menampilkan teks
- Posisi absolut dengan `move()`
---
### **Visual Hierarchy**
```
Form Utama [300x200] Form Kedua [250x150]
+-------------------------+ +---------------------+
| [Tombol] | | |
| | | Ini adalah Form |
| | | Lain |
+-------------------------+ +---------------------+
```
---
### **Mekanisme Kerja**
1. User mengklik tombol di Form Utama
2. Metode `open_other_form()` dipanggil
3. Instance `OtherForm` dibuat dan ditampilkan
4. Kedua form dapat beroperasi secara independen
---
### **Best Practice**
1. **Hindari Absolute Positioning**
Gunakan layout manager (`QVBoxLayout`, `QGridLayout`) untuk responsivitas:
```python
# Contoh dengan QVBoxLayout
layout = QVBoxLayout()
layout.addWidget(self.button)
self.setLayout(layout)
```
2. **Manajemen Memori**
Simpan referensi form kedua sebagai atribut class untuk mencegah garbage collection:
```python
self.other_form = OtherForm() # bukan variabel lokal
```
3. **Modal vs Non-Modal**
- Untuk dialog modal (blocking):
```python
self.other_form.exec_()
```
- Untuk window non-modal (default):
```python
self.other_form.show()
```
---
### **Penyempurnaan Kode**
Tambahkan fitur tambahan untuk pengalaman lebih baik:
**1. Tombol Tutup di Form Kedua**
```python
# Dalam OtherForm.py
from PyQt5.QtWidgets import QPushButton
class OtherForm(QWidget):
def __init__(self):
super().__init__()
self.setup_ui()
def setup_ui(self):
...
close_btn = QPushButton('Tutup', self)
close_btn.move(50, 80)
close_btn.clicked.connect(self.close)
```
**2. Passing Data Antar Form**
```python
# Di MainForm.py
def open_other_form(self):
self.other_form = OtherForm()
self.other_form.set_data("Hello dari Form Utama")
self.other_form.show()
# Di OtherForm.py
def set_data(self, text):
self.label.setText(text)
```
---
### **Error Handling Umum**
1. **Form Tidak Muncul**
- Pastikan tidak ada variabel lokal yang diambil garbage collector
- Cek apakah `show()` dipanggil setelah inisialisasi
2. **Posisi Overlap**
Atur posisi form kedua secara dinamis:
```python
new_x = self.x() + 50
new_y = self.y() + 50
self.other_form.move(new_x, new_y)
```
---
### **Kesimpulan**
Implementasi multi-form dalam PyQt5 relatif sederhana dengan pola:
1. Buat class turunan `QWidget` untuk setiap form
2. Inisialisasi form baru saat event terjadi
3. Kelola siklus hidup form dengan benar
**Challenge:** Coba buat form ketiga yang bisa mengirim data kembali ke form utama!
---
**Referensi Tambahan:**
- [Dokumentasi Resmi QWidget](https://doc.qt.io/qt-5/qwidget.html)
- [Panduan Komunikasi Antar Window](https://www.pythonguis.com/tutorials/pyqt-communicating-windows/)
Komentar
Posting Komentar