• Tidak ada hasil yang ditemukan

Sinyal

Dalam dokumen Belajar Python 1 (Halaman 126-134)

FormRelasi sudah dapat ditampilkan, namun tombol Simpan-nya belum berfungsi. LogikaSimpan-nya penyimpanan data dilakukan pada saat tombol tersebut di-klik. Saat inilah yang disebut se-bagai event.6 Pada saat kejadiannya (tombol di-klik), tombol tersebut mengirimkan sinyal (signal). Sinyal ini dapat diman-faatkan untuk menyisipkan fungsi penyimpanan data.

Berhubung sampai di sini belum dibahas tentang database, maka data disimpan dalam sebuah le bernama relasi.txt dengan bentuk sebagai berikut:

NAMA: <nama> ALAMAT: <alamat>

---File plaintext ini merupakan le yang bisa dibaca dengan text editor biasa.

6Karena proses tersebut maka pemrograman berorientasi objek ker-ap disebut memiliki tur event driven programming (pengendalian berdasarkan kejadian).

15.2. SINYAL 127 relasi2.py ---01| from qt import * 02| import os 03| 04| class FormRelasi(QWidget): 05| def __init__(self): 06| QWidget.__init__(self) 07| self.resize(268,194) 08| self.setCaption("Relasi") 09| labelNama = QLabel(self) 10| labelNama.setGeometry(10,10,65,20) 11| labelNama.setText("Nama") 12| labelAlamat = QLabel(self) 13| labelAlamat.setGeometry(10,40,65,20) 14| labelAlamat.setText("Alamat") 15| self.editNama = QLineEdit(self) 16| self.editNama.setGeometry(90,10,160,20) 17| self.editAlamat = QTextEdit(self) 18| self.editAlamat.setGeometry(90,40,160,102) 19| buttonSimpan = QPushButton(self) 20| buttonSimpan.setGeometry(90,150,80,24) 21| buttonSimpan.setText("Simpan") 22| self.show() 23| self.connect( buttonSimpan, 24| SIGNAL("clicked()"), self.tombolKlik ) 25| 26| def tombolKlik(self):

28| (self.editNama.text(), 29| self.editAlamat.text()) 30| file = "relasi.txt" 31| fileSementara = "~" + file 32| os.system("touch " + file) 33| os.system("touch " + fileSementara) 34| f = open(file,"r") 35| fSementara = open(fileSementara, "w") 36| fSementara.write(f.read() + rec) 37| fSementara.close() 38| f.close() 39| os.rename(fileSementara, file) 40| 41| app = QApplication([]) 42| fm = FormRelasi() 43| app.setMainWidget(fm) 44| app.exec_loop()

Fungsi connect() di atas menyatakan bahwa:

Jalankan tombolKlik() pada saat buttonSimpan men-jalankan clicked()

Karena proses itulah teknik ini disebut sebagai penyisipan fungsi ke dalam slot yang telah disediakan. Tanpa slot yang telah diberikan para pengembang Qt, maka Anda tidak dapat meny-isipkan suatu fungsi ke dalam fungsi lain yang dimiliki suatu objek. Jika itu terjadi, berarti yang perlu dilakukan adalah mendenisikan suatu class baru yang merupakan turunan dari class objek yang Anda kehendaki.

15.2. SINYAL 129 connect() sebenarnya milik class QObject yang merupakan leluhur semua class, baik yang tampak maupun tidak.

Latihan Pada saat buttonSimpan di-klik bukan hanya perin-tah penyimpanan yang dijalankan, melainkan diikuti de-ngan pengosode-ngan editNama dan editAlamat, lalu secara otomatis kursor sudah berada pada editNama.

Petunjuk Gunakan fungsi clear() untuk mengosongkan, dan setFocus() untuk memindahkan kursor pada objek yang dimaksud. Tujuannya adalah memudahkan pengguna un-tuk mengisikan data berikutnya.

Modul os

rename() adalah fungsi untuk mengubah atau memindahkan le. Sedangkan touch yang dijalankan dengan fungsi system() merupakan perintah Linux yang berfungsi memeriksa keber-adaan suatu le. Jika tidak ada ia akan membuatnya namun tidak berisi apa-apa.

15.2.1 Keterkaitan Dengan C++

Fungsi SIGNAL() pada program di atas merupakan penghubung antara Python dengan library Qt yang dibangun dengan hasa C++. Python memang dikatakan sebagai antarmuka ba-hasa C7 (C interface). Hal ini bisa juga dikatakan library yang

7C dibangun sebelum C++. Namun C++ dapat mengenal dengan baik seluruh perintah C.

ditulis untuk C dapat diakses oleh Python. Praktis Python menawarkan kekayaan tur C dan C++.

Anda dapat menggunakan dokumentasi Qt yang ditulis un-tuk C++ sebagai acuan unun-tuk mempelajari penggunaan Qt pada Python (baca: PytQt). Tentunya Anda perlu menye-suaikannya dengan gaya bahasa Python pada bagian-bagian ter-tentu.

15.2.2 Sinyal atau Event

Sinyal (signal) berkaitan dengan suatu kejadian (event) dalam objek dimana sinyal yang muncul kemudian dihubungkan de-ngan suatu fungsi.

Istilah event dalam Qt sebenarnya juga berupa kejadian yang diwakili oleh suatu fungsi. Perbedaannya dengan sinyal adalah event merupakan fungsi yang bisa diganti (override8) sifatnya oleh turunan suatu objek. Contohnya adalah __init__() yang terjadi pada saat suatu objek diciptakan.

Berikut ini contoh lain penggunaan sinyal, yaitu turunan QLineEdit yang akan memperbesar huruf.

linecase.py ---01| from qt import * 02| 03| class LineCase(QLineEdit): 04| Normal = 0

8Override:ditulis ulang atau dalam dokumentasi Qt disebut sebagai reimplementation.

15.2. SINYAL 131 05| Upper = 1

06| Lower = 2 07|

08| def __init__(self, parent, case=0): 09| QLineEdit.__init__(self, parent) 10| self.case = case 11| self._OnSet = 0 12| self._panjang = 0 13| self.teksBerubah = None 14| self.connect( self,

15| SIGNAL( "textChanged( const QString& )" ), 16| self.berubah)

17|

18| def berubah(self, t): 19| if self._OnSet: return

20| if self.case != self.Normal and \ 21| self._panjang < t.length(): 22| self._OnSet = 1 23| if self.case == self.Upper: 24| self.setText( self.text().upper() ) 25| else: 26| self.setText( self.text().lower() ) 27| self._OnSet = 0 28| self._panjang = t.length()

29| if self.teksBerubah: self.teksBerubah( self ) 30|

31| if __name__ == "__main__": 32| app = QApplication([])

34| fm.show()

35| app.setMainWidget(fm) 36| app.exec_loop()

linecase.py dapat dijalankan sebagai modul maupun program utama. Hal ini dimungkinkan karena blok utama program akan memeriksa terlebih dahulu apakah ia merupakan program uta-ma atau sebagai modul (lihat __name__)

15.2.3 Membuat Event

Sinyal textChanged() pada LineCase sudah digunakan, pada-hal Anda ingin menyisipkan fungsi lain pada saat teks berubah. Cara pertama bisa dengan menulisulang (reimplementation) Li-neCase menjadi class baru dan mengubah source fungsi berubah(). Cara ini sudah dicontohkan oleh __init__(). Sedangkan cara kedua adalah dengan menyiapkan variabel event dan (kalau ada) menjalankannya di dalam fungsi berubah() tadi. Cara ini me-mang telah diterapkan LineCase, yaitu dengan adanya variabel event teksBerubah dimana baris

if self.teksBerubah: self.teksBerubah( self ) menunjukkan bahwa variabel event teksBerubah akan diperiksa apakah nilainya sudah diganti dengan yang lain. Jika ya, ma-ka penggantinya harus berupa event dengan sebuah parameter masukan, dikarenakan ia dipanggil dengan sebuah parameter di dalamnya. Perhatikan bagian

15.2. SINYAL 133 self.teksBerubah( self )

Lebih jelasnya jalankan contoh berikut ini: linecase1.py

---01| from qt import *

02| from linecase import LineCase 03|

04| class FormCase(QWidget): 05| def __init__(self): 06| QWidget.__init__(self)

07| self.line = LineCase(self, LineCase.Lower) 08| self.line.teksBerubah = self.ubahCaption 09| self.show() 10| 11| def ubahCaption(self, w): 12| self.setCaption( w.text() ) 13| 14| app = QApplication([]) 15| fm = FormCase() 16| app.setMainWidget(fm) 17| app.exec_loop()

ubahCaption() harus memiliki parameter selain self9 yang jumlahnya sebanyak yang ditetapkan variabel event teksBerubah

pada LineCase. Contoh di atas menunjukkan parameter terse-but bertipe LineCase, sehingga fungsi text() bisa digunakan.

9Ingat, self harus disertakan dalam setiap fungsi di dalam class. Bila fungsi didenisikan di luar class, maka - tentu - self tidak perlu disertakan.

Pahami benar-benar tentang event ini, karena pada contoh-contoh selanjutnya dimanfaatkan seop-timal mungkin untuk meminimalkan kode program

Dalam dokumen Belajar Python 1 (Halaman 126-134)

Dokumen terkait