Halo, Habr!
Nama saya Sasha. Saya adalah pengembang junior. Saya bekerja sebagai penguji perangkat lunak. Saya terutama menulis tes menggunakan Python + Selenium, tetapi Python menjadi sangat menarik sehingga saya ingin mempelajari dan mempelajari sebanyak mungkin kerangka kerja! Saya ingin menulis aplikasi desktop, ala "Kalkulator" sederhana. Pilihan saya jatuh pada Pyside2. Saya tidak berpura-pura memiliki kode atau pelajaran yang sempurna. Hanya ada keinginan untuk berbagi pengalaman jika seseorang, seperti saya, ingin mulai meraba-raba dengan Python. Jika saya membantu seseorang, saya telah mencapai hasilnya.
Ayo mulai!Saya menulis kode saya di IDE PyBarm dari JetBrains. OS - Windows.
Instal PySide2:
pip install PySide2
Di mana Anda memiliki folder root Python, buka, lalu ke folder "Lib" -> "paket situs" -> "Pyside2". Anda akan memiliki program perancang - ini adalah program QtDesigner, yang memungkinkan Anda membuat antarmuka program sendiri. Perlu dicatat bahwa ketika Anda membuat file Anda di direktori proyek Anda, itu akan memiliki format.
Pertama, buat formulir Anda.

Kami membuat desain kami, memanggil tombol di sebelah kanan di subbagian "Object Inspector". Perlu dikatakan bahwa QtDesigner mendukung lembar gaya berjenjang, dan jika lebih mudah, maka dengan menemukan parameter "styleSheet" di properti, Anda memiliki kesempatan untuk membuat desain sendiri berdasarkan pengetahuan CSS.

Selanjutnya, kita perlu mengkonversi file .ui kita ke format sehingga Python memahaminya. Pergi ke baris perintah dan tulis
pyside2-uic "you_file.ui" -o "your_file.py"
Apa yang dilakukan perintah pyside2-uic? Itu mengkonversi file
.ui Anda menjadi file python
.py dan menciptakan kelas Python dari itu. Mungkin orang yang berpengetahuan akan mengatakan bahwa file ui dapat dihubungkan tanpa konversi ke proyek, tetapi saya akan rapi dan melakukan yang lebih baik, seperti yang tertulis dalam manual Pyside2.
Selanjutnya, buka kode.
Buka PyCharm, direktori proyek kami, dan buat file bernama calc_ui.py atau something_ui.py, tergantung pada program apa yang Anda lakukan. Awalan
_ui di akhir file akan membantu kita untuk tidak
tersesat dalam file. Secara umum, seharusnya terlihat seperti ini:

Mari kita mulai dengan mengedit file yang kita konversi dari
.ui ke
.py .
Di bawah ini kita mencari kode ini dan menyalinnya, lalu menghapusnya dari file ini.
if __name__ == '__main__': import sys app = QtWidgets.QApplication(sys.argv) Form = QtGui.QWidget() ui = Ui_Form() ui.setupUi(Form) Form.show() sys.exit(app.exec_())
Kami membuat file utama kami, di mana logika program akan ditulis. Saya menyebutnya, seperti, tidak mengherankan "calc.py" (di atas pada layar direktori itu terlihat).
Rekatkan kode yang kami salin di sana dan mulai mengeditnya.
impor sys kita akan melempar di awal karena ini adalah aturan yang baik.
Kami mengimpor beberapa modul yang diperlukan untuk bekerja dengan formulir kami dan dari file kami "calc_ui.py" kami mengimpor kelas utama
Ui_MainWindow .
Selanjutnya, edit
if __name__ . Kami menghapus semua yang tidak diperlukan. Anda harus memiliki ini:
if __name__ == '__main__':
Saya mengomentari kode jelas semoga. Mari beralih ke membuat kelas
Kalkulator .
class Calculator(QtWidgets.QMainWindow, Ui_MainWindow):
Selanjutnya, tugas kita adalah memastikan bahwa sesuatu terjadi ketika kita menyodok tombol "1", "2", "3", dll.
Di tempat yang sama, di konstruktor kelas, kami mendeklarasikan koneksi tombol ke fungsi apa pun:
Fungsi
self.digit_pressed sudah ditunjukkan dalam kode pada tombol, mari kita lihat, apa fungsinya jika pengguna mengklik tombol dengan angka:
Komentar pada kode juga ada.
Sekarang pertimbangkan fungsi yang akan merespons operasi penekanan
"+" ,
"-" , dll.
clear() - , def pressed_equal(self): button = self.sender() self.first_value = float(self.lineEdit.text()) self.lineEdit.clear() self.label.setText(str(self.first_value) + button.text()) self.equal = button.text()
Kami menulis nilai pertama ke variabel
self.first_value dan menghapus bidang kami untuk memasukkan nilai operasi, dan kemudian output ke lineEdit (bidang input dan hasil utama kami) semuanya bersama-sama dengan angka dan operasi.
Mengapa
mengapung ? Saya bisa menjawab sehingga saya memutuskan untuk melakukan semuanya
mengambang , dan ketika mengeluarkan nilai ke blok hasil, jika hasilnya memiliki ".0" di akhir, hapus bagian ini sehingga angka tersebut adalah bilangan bulat. Saya tidak memikirkan yang lebih baik.
Kami sekarang memiliki fungsi untuk menekan angka dan untuk menekan operasi, apa selanjutnya? Selanjutnya kita perlu menampilkan hasilnya, ini adalah tombol
= (ENTER) .
def function_result(self): if self.equal == '+': self.function_addition() elif self.equal == '-': self.function_subtraction() elif self.equal == "/": self.function_divison() elif self.equal == '*': self.function_multiply() elif self.equal == "^": self.exponentiation() elif self.equal == "%": self.function_percent() elif self.equal == "log": self.function_log()
Biarkan saya mengingatkan Anda bahwa variabel
self.first_value sekarang
persis variabel pertama yang kita masukkan, dan
self.equal berisi operasi yang kami tekan. Setelah kita memasukkan angka kedua dan tekan
= , kita mencoba mencari tahu apa operasi itu, dan kemudian kita menentukan variabel ke-2.
Kami beralih ke fungsi operasi. Saya mendapatkannya seperti ini:
def function_addition(self): self.determinate_second_value() self.result = float(self.first_value + self.second_value) self.form_result() def function_subtraction(self): self.determinate_second_value() self.result = float(self.first_value - self.second_value) self.form_result() def function_divison(self): self.determinate_second_value() self.result = float(self.first_value / self.second_value) self.form_result() def function_multiply(self): self.determinate_second_value() self.result = float(self.first_value * self.second_value) self.form_result() def function_exponentiation(self): self.determinate_second_value() self.result = float(self.first_value ** self.second_value) self.form_result() def function_percent(self): self.determinate_second_value() self.result = float(self.first_value * (self.second_value / 100)) self.form_result() def function_log(self): self.determinate_second_value() self.result = float(math.log(self.first_value, self.second_value)) self.form_result()
Fungsi
self.determinate_second_value () menentukan nilai kedua dari variabel yang kita masukkan. Ini tidak sedikit logis dan bengkok, tetapi sebagaimana adanya, saya akan mencoba untuk memperhitungkan semua kesalahan nanti dalam komentar ketika orang-orang pintar mengatakan caranya.
Sedikit penyegaran.
- self.first_value - memiliki nilai dari angka pertama yang dimasukkan
- self.equal - memiliki str dari variabel operasi yang kami tekan
- self.second_value - memiliki nilai variabel kedua
Selanjutnya, di masing-masing fungsi operasi, kami memanggil
self.form_result () , yang anehnya, membentuk hasil kami. Kami menyimpan hasilnya dalam variabel
self.result .
def form_result(self): self.result = str(self.result) if self.result[-2:] == '.0': self.result = self.result[:-2] self.lineEdit.setText(str(self.result)) self.label.clear()
Saya akan jelaskan untuk diri sendiri.
Hasil [-2:] . [-2:] berarti kita membandingkan 2 karakter terakhir dari string dengan ".0".
Jadi hasil kami ditampilkan di blok lineEdit utama, selamat.
Saya juga akan melampirkan di sini kode yang menghapus satu karakter dari string atau seluruh angka atau menambahkan "." (titik) untuk membuat angka pecahan:
def make_fractional(self): value = self.lineEdit.text() if '.' not in value: self.lineEdit.setText(value + '.') def function_delete(self): value = self.lineEdit.text() self.lineEdit.setText(value[:-1]) def function_clear(self): self.lineEdit.setText('0')
Semua kode di bawah spoiler:
Seluruh kode from PySide2 import QtWidgets from calc_ui import Ui_MainWindow import sys import math class Calculator(QtWidgets.QMainWindow, Ui_MainWindow): def __init__(self): super().__init__()
Ya, kalkulator tidak menghitung fungsi dan ekspresi besar, saya sedang mengerjakannya!
Terima kasih banyak atas perhatiannya. Semoga sukses dan berkembang! Ini luar biasa.
Saya juga ingin mengundang Anda ke saluran
JuniorProger Telegram saya, di mana saya berbicara tentang kehidupan seorang programmer Junior dan duri, tetapi cara yang sangat menarik untuk menjadi spesialis It.