การสร้าง GUI Form ด้วย PyQt และ · 2020-01-18 ·...

43
Python-GUI 1 การสร้าง GUI Form ด้วย PyQt และ Qt Designer ในกรณีที ่ต้องการใช้เครื ่องมือช่วยสร้าง GUI Form ประเภทลากวาง widget ต่างๆ เพื ่อจัดการ หน้าต่างโปรแกรมนั ้น ภาษา Python ได้จัดเตรียมโมดูล PyQt และ Qt Designer ให้สามารถใช้เป็นเครื ่องมือ ช่วยสร้างและออกแบบหน้าต่างโปรแกรมได้ง่ายและสะดวกขึ ้น การติดตั้งโมดูล PyQt และ Qt Designer วิธีการติดตั้งโมดูล PyQt และ Qt Designer สามารถดาเนินการโดยเลือกติดตั้งโมดูล PyQt5, PyQt- stubsและ pyqt5-tools ซึ ่งเมื ่อติดตั้งได้สาเร็จแล้ว สามารถตรวจสอบได้โดยจะแสดงอยู ่ในหน้าต่างของการตั ้ง ค่า ดังนี โดยไฟล์โมดูลต่างๆ ที ่ได้ถูกติตตั ้งนั้น จะจัดเก็บอยู ่ที ่โฟลเดอร์ ..\python\code\venv\Lib\site-packages\ ซึ ่งสามารถตรวจสอบได้โดยจะแสดงอยู ่ในโฟลเดอร์ ดังนี การใช้งาน Qt Designer ในการใช้งาน Qt Designer เพื ่อออกแบบและสร้าง GUI Fotm มีขั้นตอน ดังนี 1. ดับเบิลคลิกไฟล์ designer.exe ซึ ่งอยู ่ที ่โฟลเดอร์ ..\python\code\\venv\Lib\site-packages\pyqt5_tools\Qt\bin

Transcript of การสร้าง GUI Form ด้วย PyQt และ · 2020-01-18 ·...

Page 1: การสร้าง GUI Form ด้วย PyQt และ · 2020-01-18 · ในการใช้งาน Qt Designer เพื่อออกแบบและสร้าง

Python-GUI 1

การสราง GUI Form ดวย PyQt และ Qt Designer

ในกรณทตองการใชเครองมอชวยสราง GUI Form ประเภทลากวาง widget ตางๆ เพอจดการหนาตางโปรแกรมนน ภาษา Python ไดจดเตรยมโมดล PyQt และ Qt Designer ใหสามารถใชเปนเครองมอชวยสรางและออกแบบหนาตางโปรแกรมไดงายและสะดวกขน

การตดตงโมดล PyQt และ Qt Designer วธการตดตงโมดล PyQt และ Qt Designer สามารถด าเนนการโดยเลอกตดตงโมดล PyQt5, PyQt-stubsและ pyqt5-tools ซงเมอตดตงไดส าเรจแลว สามารถตรวจสอบไดโดยจะแสดงอยในหนาตางของการตงคา ดงน

โดยไฟลโมดลตางๆ ทไดถกตตตงนน จะจดเกบอยทโฟลเดอร ..\python\code\venv\Lib\site-packages\ ซงสามารถตรวจสอบไดโดยจะแสดงอยในโฟลเดอร ดงน

การใชงาน Qt Designer ในการใชงาน Qt Designer เพอออกแบบและสราง GUI Fotm มขนตอน ดงน 1. ดบเบลคลกไฟล designer.exe ซงอยทโฟลเดอร

..\python\code\\venv\Lib\site-packages\pyqt5_tools\Qt\bin

Page 2: การสร้าง GUI Form ด้วย PyQt และ · 2020-01-18 · ในการใช้งาน Qt Designer เพื่อออกแบบและสร้าง

Python-GUI 2

2. จะปรากฏหนาตางใหเลอกรปแบบ template\forms เปนแบบ widget และคลกปม

3. จะปรากฏหนาตางซงมสวนประกอบหลกๆ ดงน • Form เปนสวนของพนททเราสามารถน า widget ตางๆ มาวางประกอบกนเปน GUI Form

• Widget Box เปนสวนของ widget ตางๆ ทเราสามารถคลกเลอกมาวางบน Form

• Object Inspector เปนสวนแสดงรายการของ widget ทเราน ามาวางบน Form

• Property Editor เปนสวนแสดงคณสมบตของ widget ทเราน ามาวางบน Form ซงสามารถเปลยนแปลงและก าหนดคาใหมได

4. จากนนคลกเลอก widget แบบ Label, TextEdit และ PushButton โดยจดวางบน Form ตามล าดบ และบนทกเปนไฟล .ui ตงชอวา memberform.ui

Page 3: การสร้าง GUI Form ด้วย PyQt และ · 2020-01-18 · ในการใช้งาน Qt Designer เพื่อออกแบบและสร้าง

Python-GUI 3

ก าหนดคณสมบตของแตละ widget ดงน

ประเภท widget ชอ objectName ขอความ text รปภาพ icon QLabel idlabel ID - QTextEdit idtext - - QLabel namelabel Name - QTextEdit nametext - - QLabel emaillabel E-mail - QLineEdit emailtext - - QPushButton savebutton Save คลกเลอก Theme

ไฟลภาพ QPushButton resetbutton Reset

5. ในขนตอนนจะไดไฟล memberform.ui จดเกบอยทโฟลเดอร ..\python\code\venv\Lib\site-packages\pyqt5_tools\Qt\bin

เนองจาก Qt Designer เปนโปรแกรมทใชในการออกแบบ GUI Form ซงยงไมสามารถน าไปใชงานกบภาษา Python ได จงตองแปลงไฟล .ui ใหเปน .py ซงจะไดศกษาในหวขอถดไป

Page 4: การสร้าง GUI Form ด้วย PyQt และ · 2020-01-18 · ในการใช้งาน Qt Designer เพื่อออกแบบและสร้าง

Python-GUI 4

การแปลง GUI Form เปนไฟลภาษา Python ในการแปลง GUI Form เปนไฟลภาษา Python นน เราจะใชไฟล pyuic5.exe ซงอยทโฟลเดอร

..\venv\Scripts โดยจะตองระบชอไฟล .ui และไฟล .py ทตองการแปลงผาน command prompt ตามรปแบบค าสง pyuic5 memberform.ui -o memberform.py

เพอใหงายตอการใชงาน สามารถสรางค าสงการแปลงไฟลเปนไฟล .bat และสงใหแปลงไฟลโดยการดบเบลทไฟล .bat นน ซงมข นตอน ดงน

1. คดลอกไฟล pyuic5.exe, ไฟล memberform.ui และไฟลรปภาพไวทโฟลเดอร ..\python\code\

2. สรางค าสงการแปลงไฟล โดยใชโปรแกรม Text Editor และบนทกเปนไฟล .bat ดงน

Page 5: การสร้าง GUI Form ด้วย PyQt และ · 2020-01-18 · ในการใช้งาน Qt Designer เพื่อออกแบบและสร้าง

Python-GUI 5

3. เมอดบเบลทไฟล convert.bat ค าสงการแปลงไฟลกจะท างาน และสรางไฟล memberform.py ในโฟลเดอร ดงน

4. ชดค าสงในไฟล memberform.py จะเปนชดค าสงทสรางขนจากฟอรมทไดคลกลากวาง widget ตางๆ โดยใช Qt Designer ซงมโคดดงน

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44

# -*- coding: utf-8 -*- # Form implementation generated from reading ui file 'memberform.ui' # # Created by: PyQt5 UI code generator 5.13.0 # # WARNING! All changes made in this file will be lost! from PyQt5 import QtCore, QtGui, Qtwidgets class Ui_Form(object): def setupUi(self, Form): Form.setObjectName("Form") Form.resize(218, 164) self.idlabel = Qtwidgets.QLabel(Form) self.idlabel.setGeometry(QtCore.QRect(30, 20, 41, 16)) font = QtGui.QFont() font.setFamily("Microsoft Sans Serif") font.setPointSize(12) self.idlabel.setFont(font) self.idlabel.setObjectName("idlabel") self.savebutton = Qtwidgets.QPushButton(Form) self.savebutton.setGeometry(QtCore.QRect(40, 120, 61, 25)) font = QtGui.QFont() font.setFamily("Microsoft Sans Serif") font.setPointSize(12) self.savebutton.setFont(font) icon = QtGui.QIcon() icon.addPixmap(QtGui.QPixmap("save.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off) self.savebutton.setIcon(icon) self.savebutton.setIconSize(QtCore.QSize(16, 16)) self.savebutton.setObjectName("savebutton") self.nametext = Qtwidgets.QLineEdit(Form) self.nametext.setEnabled(True) self.nametext.setGeometry(QtCore.QRect(80, 50, 111, 21)) font = QtGui.QFont() font.setFamily("Microsoft Sans Serif") font.setPointSize(12) self.nametext.setFont(font) self.nametext.setObjectName("nametext") self.emailtext = Qtwidgets.QLineEdit(Form) self.emailtext.setEnabled(True)

Page 6: การสร้าง GUI Form ด้วย PyQt และ · 2020-01-18 · ในการใช้งาน Qt Designer เพื่อออกแบบและสร้าง

Python-GUI 6

45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96

self.emailtext.setGeometry(QtCore.QRect(80, 80, 111, 21)) font = QtGui.QFont() font.setFamily("Microsoft Sans Serif") font.setPointSize(12) self.emailtext.setFont(font) self.emailtext.setObjectName("emailtext") self.resetbutton = Qtwidgets.QPushButton(Form) self.resetbutton.setGeometry(QtCore.QRect(120, 120, 61, 25)) font = QtGui.QFont() font.setFamily("Microsoft Sans Serif") font.setPointSize(12) self.resetbutton.setFont(font) icon1 = QtGui.QIcon() icon1.addPixmap(QtGui.QPixmap("reset.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off) self.resetbutton.setIcon(icon1) self.resetbutton.setIconSize(QtCore.QSize(16, 16)) self.resetbutton.setObjectName("resetbutton") self.emaillabel = Qtwidgets.QLabel(Form) self.emaillabel.setGeometry(QtCore.QRect(30, 80, 41, 16)) font = QtGui.QFont() font.setFamily("Microsoft Sans Serif") font.setPointSize(12) self.emaillabel.setFont(font) self.emaillabel.setObjectName("emaillabel") self.idtext = Qtwidgets.QLineEdit(Form) self.idtext.setEnabled(True) self.idtext.setGeometry(QtCore.QRect(80, 20, 111, 21)) font = QtGui.QFont() font.setFamily("Microsoft Sans Serif") font.setPointSize(12) self.idtext.setFont(font) self.idtext.setObjectName("idtext") self.namelabel = Qtwidgets.QLabel(Form) self.namelabel.setGeometry(QtCore.QRect(30, 50, 41, 16)) font = QtGui.QFont() font.setFamily("Microsoft Sans Serif") font.setPointSize(12) self.namelabel.setFont(font) self.namelabel.setObjectName("namelabel") self.retranslateUi(Form) QtCore.QMetaObject.connectSlotsByName(Form) def retranslateUi(self, Form): _translate = QtCore.QCoreApplication.translate Form.setWindowTitle(_translate("Form", "Form: insert")) self.idlabel.setText(_translate("Form", "ID")) self.savebutton.setText(_translate("Form", "save")) self.savebutton.setShortcut(_translate("Form", "Enter")) self.resetbutton.setText(_translate("Form", "reset")) self.emaillabel.setText(_translate("Form", "E-mail")) self.namelabel.setText(_translate("Form", "Name"))

หลงจากทเราแปลงไฟล memberform.ui ใหเปน memberform.py แลว จะเปนการเขยนค าสงใชงาน

โมดล PyQt5 เพอท าให GUI Form สามารถท างานได ซงจะไดศกษาในหวขอถดไป

การเขยนค าสงเพอใชงานโมดล PyQt5 ในการเขยนค าสงเพอใชงานโมดล PyQt5 มขนตอน ดงน 1. คดลอกโฟลเดอร PyQt5 ทจดเกบอยทโฟลเดอร ..\python\code\venv\Lib\site-packages\ มา

ไวท ..\python\code\

Page 7: การสร้าง GUI Form ด้วย PyQt และ · 2020-01-18 · ในการใช้งาน Qt Designer เพื่อออกแบบและสร้าง

Python-GUI 7

2. เขยนโปรแกรม run_memberform.py เพอสงใหไฟล memberform.py ท างาน ซงมโคดดงน 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17

from PyQt5.Qtwidgets import Qwidget, QApplication, QMainWindow import memberform import sys class MyApp(QMainWindow): def __init__(self, parent=None): Qwidget.__init__(self, parent) self.ui = memberform.Ui_Form() self.ui.setupUi(self) if __name__ == '__main__': app = QApplication(sys.argv) mapp = MyApp() mapp.show() sys.exit(app.exec_())

จากโปรแกรม run_memberform.py ขางตน อธบายการท างานของโปรแกรมได ดงน

บรรทดท 1 อมพอรตโมดลเพอใชงาน widget ตางๆ ทอยบน memberform บรรทดท 2-3 อมพอรตโมดล memberform และโมดล sys บรรทดท 6-10 สรางคลาส MyApp และก าหนดคาเรมตนตางๆ ของ memberform ผานเมธอด __init__ บรรทดท 13-17 เปนสวนโปรแกรมหลกทเรยกใช คลาส MyApp ซงเปนการสงให memberform ท างาน

ผลการท างานของโปรแกรมแสดงไดดงน

เมอ GUI Form ทสรางขนสามารถแสดงผลเปนหนาจอการท างานแลว ขนตอนตอไปจะเปนการเขยนโปรแกรมควบคมการท างานตามเหตการณตางๆ เชน การคลกป ม, การเลอกรายการ เปนตน

Page 8: การสร้าง GUI Form ด้วย PyQt และ · 2020-01-18 · ในการใช้งาน Qt Designer เพื่อออกแบบและสร้าง

Python-GUI 8

ในสวนนจะตองเขยนชดค าสงเพมเขาในโปรแกรมทสงใหไฟล GUI Form ท างาน ซงผเขยนจะไดอธบายในหวขอโปรแกรมประยกตตอไป

ตวอยางโปรแกรมประยกต ในหวขอนเปนการประยกตใช GUI Form ทสรางขน โดยเขยนชดค าสงเพอเชอมตอและควบคมการ

ท างานของ widget ตางๆ ทสรางอยบนหนาจอ เพอใหสามารถพฒนาโปรแกรมทสามารถใชงานไดจรง

ตวอยางการประยกตใชฐานขอมล SQLite กบการจดการขอมลการรบสนคาเขาในคลงสนคา ฐานขอมลการรบสนคาเขา (stockDB.db) ในตวอยางน ประกอบดวยสวนการท างานตางๆ ดงน

1. การจดการขอมลผใช 2. การจดการขอมลสนคา การจดการใน 2 สวนนจะสามารถเพม ลบ และแกไข ขอมลได โดยการลบสนคาจะใชหลกการ

ของการเปลยนสถานะสนคาจาก active เปน inactive โดยไมไดลบขอมลออกจากฐานขอมลจรง 3. การจดการขอมลการรบสนคาเขา การจดการในสวนนจะมการคดตนทนสนคาตามหลกการค านวณตนทนสนคาเฉลยจากการท

รบเขามาสนคาเขามาในแตละครงดวยตนทนราคาสนคาทไมเทากน โดยฐานขอมลการรบสนคาเขา จะถกจดเกบดวยฐานขอมล SQLite ซงประกอบดวย

รายละเอยดขอมลดงน • ตารางขอมลผใช (employee) ประกอบดวยขอมล

1. รหสผใช empid ชนดขอความ TEXT (PK) 2. รหสผาน emppw ชนดขอความ TEXT 3. ประเภทผใช emptype ชนดตวเลขจ านวนเตม INT (1: admin, 2: user) 4. สถานะสนคา empdelete ชนดตวเลขจ านวนเตม INT (0: inactive, 1: active)

• ตารางขอมลสนคา (product) ประกอบดวยขอมล 1. รหสสนคา pid ชนดขอความ TEXT (PK) 2. ชอสนคา pname ชนดขอความ TEXT 3. จ านวนสนคา pqty ชนดตวเลขจ านวนเตม INT 4. ตนทนสนคา pcost ชนดตวเลขทศนยม REAL 5. ชอไฟลภาพสนคา ppic ชนดขอความ TEXT 6. สถานะสนคา pdelete ชนดตวเลขจ านวนเตม INT (0: inactive, 1: active)

• ตารางขอมลการโอนยาย (transfer) ประกอบดวยขอมล 1. ล าดบทการรบเขา stno ชนดตวเลขจ านวนเตม INT (PK: Autoincrement) 2. วนทรบสนคาเขา stdate ชนดวนท Date 3. รหสสนคา pid ชนดขอความ TEXT 4. รหสผใช empid ชนดขอความ TEXT 5. จ านวนสนคา stqty ชนดตวเลขจ านวนเตม INT

Page 9: การสร้าง GUI Form ด้วย PyQt และ · 2020-01-18 · ในการใช้งาน Qt Designer เพื่อออกแบบและสร้าง

Python-GUI 9

6. ตนทนสนคา stcost ชนดตวเลขทศนยม REAL ในสวนของการเขยนโปรแกรมเพอจดการขอมลการรบสนคาเขาในคลงสนคา มข นตอน ดงน

1. ออกแบบ GUI Form เพอใชงาน ทงหมด 10 หนาจอ ดงน • loginform.ui เปนหนาจอส าหรบการเขาสระบบ

• menusform.ui เปนหนาจอแสดงเมนและปมเพอเขาใชงานในสวนตางๆ

• employeeinsertform.ui เปนหนาจอส าหรบการจดการเพมขอมลผใช

• employeeqryform.ui เปนหนาจอส าหรบการแสดงขอมลผใชทงหมด

Page 10: การสร้าง GUI Form ด้วย PyQt และ · 2020-01-18 · ในการใช้งาน Qt Designer เพื่อออกแบบและสร้าง

Python-GUI 10

• employeeupdateform.ui เปนหนาจอส าหรบการแกไข และลบขอมลผใช

• productinsertform.ui เปนหนาจอส าหรบการจดการเพมขอมลสนคา

• productqryform.ui เปนหนาจอส าหรบการแสดงขอมลสนคาทงหมด

• productupdateform.ui เปนหนาจอส าหรบการแกไข และลบขอมลสนคา

Page 11: การสร้าง GUI Form ด้วย PyQt และ · 2020-01-18 · ในการใช้งาน Qt Designer เพื่อออกแบบและสร้าง

Python-GUI 11

• stockininsertform.ui เปนหนาจอส าหรบการจดการเพมขอมลสนคาทรบเขา

• stockinqryform.ui เปนหนาจอส าหรบการแสดงขอมลสนคาทรบเขาทงหมด

2. แปลงไฟล GUI Form ใหเปนไฟล python และเขยนโปรแกรมเรยกโมดล PyQt5 เพอใชรน GUI Form ใหสามารถท างานได ซงมรายละเอยดไฟลทงหมด ดงน

ไฟล GUI Form (.ui) ไฟล GUI Form (.py) ไฟลรน GUI Form (.py) loginform loginform run_loginform menusform menusform run_menusform employeeinsertform employeeinsertform run_empinsertform employeeqryform employeeqryform run_empqryform employeeupdateform employeeupdateform run_empupdateform productinsertform productinsertform run_productinsertform productqryform productqryform run_productqryform productupdateform productupdateform run_productupdateform stockininsertform stockininsertform run_stockininsertform stockininsertform stockininsertform run_stockininsertform

3. เขยนโปรแกรมในสวนของโมดลทใชภาษา SQL จดการฐานขอมล โดยผเขยนจะเขยนแยก

เปนแตละโมดลเพอจดการในสวนของการสรางฐานขอมล การจดการขอมลผใช ขอมลสนคา และขอมลสนคาทรบเขา ซงมรายละเอยดไฟลทงหมด ดงน • module_create.py จดการสรางฐานขอมล • module_emp.py จดการขอมลผใช

Page 12: การสร้าง GUI Form ด้วย PyQt และ · 2020-01-18 · ในการใช้งาน Qt Designer เพื่อออกแบบและสร้าง

Python-GUI 12

• module_product.py จดการขอมลสนคา • module_stockin.py จดการขอมลสนคาทรบเขา

ในสวนตอไป ผเขยนจะขออธบายโคดโปรแกรมทงหมด ซงประกอบดวยสวนจดการฐานขอมล และสวนจดการควบคมการท างานของหนาจอ ซงมรายละเอยดดงน

1. โปรแกรมจดการฐานขอมล (module_create.py) มโคดดงน 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26

import sqlite3 def createTable(): con = sqlite3.connect('stockDB.db') try: sql = 'CREATE TABLE IF NOT EXISTS ' \ 'employee (empid TEXT PRIMARY KEY NOT NULL, ' \ 'emppw TEXT, emptype INT, ' \ 'empdelete INT NOT NULL DEFAULT 1)' con.execute(sql) sql = 'CREATE TABLE IF NOT EXISTS product ' \ '(pid TEXT PRIMARY KEY NOT NULL, ' \ 'pname TEXT, pqty INT, pcost REAL, ' \ 'ppic TEXT, pdelete INT NOT NULL DEFAULT 1)' con.execute(sql) sql = 'CREATE TABLE IF NOT EXISTS stockin ' \ '(stno INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, ' \ 'stdate TEXT, pid TEXT, empid TEXT, stqty INT, stcost REAL)' con.execute(sql) except con.Error as e: if con: print('error is', e) con.close()

จากโปรแกรม module_create.py อธบายการท างานของโปรแกรมไดดงน

บรรทดท 1 อมพอรตโมดล sqlite3 บรรทดท 4-26 สรางฟงกชน createtable() เพอเชอมตอฐานขอมล stockDB.db และสรางตารางขอมล

employee, product และ stockin ตามโครงสรางขอมลทไดออกแบบไว

Tip

การก าหนดคาเรมตนใหกบฟลดขอมล สามารถใชค าสง DEFAULT และตามดวยคาทตองการก าหนด ตามค าสงในบรรทดท 10 และ 16

การก าหนดคาตวเลขอตโนมต (Autoincrement) ใหกบฟลดขอมลทเปนคยหลก จะตองก าหนดชนดขอมลใหเปน INTEGER ตามค าสงในบรรทดท 20

2. โปรแกรมจดการขอมลผใช (module_emp.py) มโคดดงน

1 2 3 4 5 6 7 8 9

import sqlite3 def insertemployee(empid, emppw, emptype): con = sqlite3.connect('stockDB.db') try: sql = 'insert into employee (empid, emppw, emptype) ' \ 'VALUES("' + empid + '", "' + emppw + '" ,' \ + str(emptype) + ')'

Page 13: การสร้าง GUI Form ด้วย PyQt และ · 2020-01-18 · ในการใช้งาน Qt Designer เพื่อออกแบบและสร้าง

Python-GUI 13

10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77

con.execute(sql) con.commit() except con.Error as e: if con: print("error is ", e) con.rollback() finally: if con: con.close() def updateemployee(empid, emppw, emptype): con = sqlite3.connect('stockDB.db') try: sql = 'UPDATE employee SET emppw = "' + emppw + '", ' \ 'emptype = ' + str(emptype) + \ ' WHERE empid = "' + empid + '"' con.execute(sql) con.commit() except con.Error as e: if con: print("error is ", e) con.rollback() finally: if con: con.close() def deleteemployee(empid, active): con = sqlite3.connect('stockDB.db') try: if active == 0: sql = 'DELETE FROM employee ' \ 'WHERE empid = "' + empid + '"' else: sql = 'UPDATE employee SET empdelete = 0 ' \ 'WHERE empid = "' + empid + '"' con.execute(sql) con.commit() except con.Error as e: if con: print("error is ", e) con.rollback() finally: if con: con.close() def selectlastemployeeid(): con = sqlite3.connect('stockDB.db') try: result = 0 sql = 'SELECT * FROM employee WHERE empdelete = 1 ' \ 'ORDER BY empid' data = con.execute(sql) for row in data: result = row[0] return result except con.Error as e: if con: print("error is ", e) finally: if con: con.close() def selectemployee(empid, emppw): con = sqlite3.connect('stockDB.db')

Page 14: การสร้าง GUI Form ด้วย PyQt และ · 2020-01-18 · ในการใช้งาน Qt Designer เพื่อออกแบบและสร้าง

Python-GUI 14

78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145

try: sql = 'SELECT * FROM employee ' \ 'WHERE empid = "' + empid + '" ' \ 'AND emppw = "' + emppw + '" ' \ 'AND empdelete = 1' data = con.execute(sql) result = list() for row in data: result.append(row) if len(result) == 0: result = False return result except con.Error as e: if con: print("error is ", e) finally: if con: con.close() def selectallemployee(no): con = sqlite3.connect('stockDB.db') try: if no == 0: sql = 'SELECT * FROM employee ' \ 'ORDER BY empid' else: sql = 'SELECT * FROM employee WHERE empdelete = 1 ' \ 'ORDER BY empid' data = con.execute(sql) result = list() title = 'EMPLOYEE DATA' result.append(title) result.append('='*35) heading = '(ID) (Password) (Type) (Status)' result.append(heading) for row in data: if row[2] == 1: emptype = 'admin' else: emptype = 'user' if row[3] == 1: active = 'active' else: active = 'inactive' msg = "({:s}) ({:s}) ({:s}) ({:s})".format(row[0], row[1], emptype, active) result.append(msg) if len(result) == 3: result.remove(heading) result.append('No Data') result.append('='*35) if len(result) > 4: sum_sql = 'SELECT count(empid) ' \ ' FROM employee where emptype = 1 and empdelete = 1' sum_data = con.execute(sum_sql) count1 = 0 for row in sum_data: count1 = row[0] sum_sql = 'SELECT count(empid) ' \ 'FROM employee where emptype = 2 and empdelete = 1' sum_data = con.execute(sum_sql) count2 = 0 for row in sum_data: count2 = row[0] footer = "admin = {:d} persons, user = {:d} persons".format(count1, count2) result.append(footer) footer = "total employee = {:d} persons".format(count1+count2) result.append(footer)

Page 15: การสร้าง GUI Form ด้วย PyQt และ · 2020-01-18 · ในการใช้งาน Qt Designer เพื่อออกแบบและสร้าง

Python-GUI 15

146 147 148 149 150 151 152 153 154 155 156 157 158 159 160

result.append('='*35) return result except con.Error as e: if con: print("error is ", e) finally: if con: con.close() def printempqry(data): msg = '' for row in data: msg = msg + str(row) + "\n" return msg

จากโปรแกรม module_emp.py อธบายการท างานของโปรแกรมไดดงน

บรรทดท 1 อมพอรตโมดล sqlite3 บรรทดท 4-18 สรางฟงกชน insertemployee() เพอ insert ขอมลสนคาลงในตาราง employee บรรทดท 21-35 สรางฟงกชน updateemployee() เพอ update ขอมลสนคาในตาราง employee บรรทดท 38-55 สรางฟงกชน deleteemployee() เพอ delete ขอมลในตาราง employee

Note

การลบขอมลม 2 กรณ คอ

1) กรณขอมลทตองการลบมสถานะเปน active จะเปนการ update ขอมลโดยเปลยนสถานะเปน inactive

2) กรณขอมลทตองการลบมสถานะเปน inactive จะเปนการ delete ขอมล จากตาราง employee

บรรทดท 58-73 สรางฟงกชน selectlastemployeeid() เพอ select ขอมลรหสผใชลาสดจากตาราง employee เพอน าใชสรางเปนรหสผใชใหม

บรรทดท 76-95 สรางฟงกชน selectemployee(empid, emppw) เพอ select ขอมลรหสผใช empid และรหสผาน emppw จากตาราง employee เพอใชตรวจสอบการเขาสระบบ

บรรทดท 97-153 สรางฟงกชน selectallemployee(no) เพอ select ขอมล จากตาราง employee และจดรปแบบการแสดงผลเพอน าไปใชงาน

Note

การ select ขอมลม 2 กรณ คอ

1) กรณตองการขอมลทงหมด

2) กรณตองการขอมลทมสถานะเปน active

บรรทดท 156-160 สรางฟงกชน printempqry(data) เพอน าขอมล data มาเชอมตอเปนขอความ msg เพอน าไปใชงาน

3. โปรแกรมจดการขอมลสนคา (module_product.py) มโคดดงน

1 2 3 4 5

import sqlite3 def insertproduct(id, name, qty, cost, pic): con = sqlite3.connect('stockDB.db')

Page 16: การสร้าง GUI Form ด้วย PyQt และ · 2020-01-18 · ในการใช้งาน Qt Designer เพื่อออกแบบและสร้าง

Python-GUI 16

6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73

try: sql = 'INSERT INTO product ' \ '(pid, pname, pqty, pcost, ppic) ' \ 'VALUES ("' + id + '","' + name + '",' + \ str(qty) + ',' + str(cost) + \ ',"' + pic + '")' con.execute(sql) con.commit() except con.Error as e: if con: print('error is', e) con.rollback() finally: if con: con.close() def updateproduct(id, name, qty, cost, pic): con = sqlite3.connect('stockDB.db') try: sql = 'UPDATE product SET pname = "' + name + \ '", pqty = ' + str(qty) + \ ', pcost = ' + str(cost) + \ ', ppic = "' + pic + \ '" WHERE pid = "' + id + '"' con.execute(sql) con.commit() except con.Error as e: if con: print("error is ", e) con.rollback() finally: if con: con.close() def selectlastproductid(): con = sqlite3.connect('stockDB.db') try: result = 0 sql = 'SELECT * FROM product ORDER BY pid' data = con.execute(sql) for row in data: result = row[0] return result except con.Error as e: if con: print("error is ", e) finally: if con: con.close() def selectproduct(pid): con = sqlite3.connect('stockDB.db') try: sql = 'SELECT * FROM product WHERE pid = "' + pid + '"' data = con.execute(sql) result = list() for row in data: result.append(row) return result except con.Error as e: if con: print("error is ", e) finally: if con: con.close()

Page 17: การสร้าง GUI Form ด้วย PyQt และ · 2020-01-18 · ในการใช้งาน Qt Designer เพื่อออกแบบและสร้าง

Python-GUI 17

74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122

def selectallproduct(no): con = sqlite3.connect('stockDB.db') try: sql = 'SELECT * FROM product ORDER BY pid' data = con.execute(sql) result = list() title = ' PRODUCT DATA' result.append(title) result.append('='*40) heading = '(ID) (Name) (Quantity) (Cost)' result.append(heading) for row in data: if no == 1: msg = '({:s}) ({:s}) ({:,d}) ({:,.2f})'.format(row[0], row[1], int(row[2]), float(row[3])) else: msg = '({:s}) ({:s}) ({:,d}) ({:,.2f}) ({:s})'.format(row[0], row[1], int(row[2]), float(row[3]), row[4]) result.append(msg) if len(result) == 3: result.remove(heading) result.append('No Data') result.append('='*40) if len(result) > 4: sum_sql = 'SELECT sum(pqty), ' \ 'sum(pqty*pcost) FROM product' sum_data = con.execute(sum_sql) total_sum = 0 for row in sum_data: total_sum = row footer = "total quantity = {:,.0f} pieces".format(total_sum[0]) result.append(footer) footer = "total cost = {:,.2f} baht".format(total_sum[1]) result.append(footer) result.append('='*40) return result except con.Error as e: if con: print("error is ", e) finally: if con: con.close() def printproductqry(data): msg = '' for row in data: msg = msg + str(row) + "\n" return msg

จากโปรแกรม module_product.py อธบายการท างานของโปรแกรมไดดงน

บรรทดท 1 อมพอรตโมดล sqlite3 บรรทดท 4-20 สรางฟงกชน insertproduct() เพอ insert ขอมลสนคาลงในตาราง product บรรทดท 23-39 สรางฟงกชน updateproduct() เพอ update ขอมลสนคาในตาราง product บรรทดท 42-56 สรางฟงกชน selectlastproductid() เพอ select ขอมลรหสผใชลาสดจากตาราง

product เพอน าใชสรางเปนรหสสนคาใหม บรรทดท 59-73 สรางฟงกชน selectproduct(pid) เพอ select ขอมลรหสlสนคา pid เพอน าไปใชงาน บรรทดท 76-115 สรางฟงกชน selectallproduct(no) เพอ select ขอมลจากตาราง product และจดรปแบบ

การแสดงผลเพอน าไปใชงาน

Page 18: การสร้าง GUI Form ด้วย PyQt และ · 2020-01-18 · ในการใช้งาน Qt Designer เพื่อออกแบบและสร้าง

Python-GUI 18

Note

การ select ขอมลม 2 กรณ คอ

1) กรณตองการขอมลทงหมดยกเวนชอไฟลภาพสนคา

2) กรณตองการขอมลทงหมด

บรรทดท 118-122 สรางฟงกชน printempqry(data) เพอน าขอมล data มาเชอมตอเปนขอความ msg เพอน าไปใชงาน

4. โปรแกรมจดการขอมลสนคาทรบเขา (module_stockin.py) มโคดดงน

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51

import sqlite3 def insertstockin(stdate, pid, empid, stqty, stcost): con = sqlite3.connect('stockDB.db') try: sql = 'INSERT INTO stockin (stdate, pid, empid, stqty, stcost) ' \ 'VALUES ("' + stdate + '", "' + pid + '", "' + empid + '", ' + \ str(stqty) + ',' + str(stcost) + ')' con.execute(sql) con.commit() except con.Error as e: if con: print("error is ", e) con.rollback() finally: if con: con.close() def selectallstockin(): con = sqlite3.connect('stockDB.db') try: sql = 'SELECT stockin.pid, product.pname, ' \ 'sum(stockin.stqty), avg(stockin.stcost) ' \ 'FROM stockin, product ' \ 'WHERE stockin.pid = product.pid ' \ 'GROUP BY stockin.pid ORDER BY stockin.pid' data = con.execute(sql) result = list() title = 'STOCK IN DATA' result.append(title) result.append('='*40) heading = '(ID) (Name) (Quantity) (Cost)' result.append(heading) for row in data: msg = '({:s}) ({:s}) ({:,d}) ({:,.2f})'.format(row[0], row[1], int(row[2]), float(row[3]), float(row[4])) result.append(msg) if len(result) == 3: result.remove(heading) result.append('No Data') result.append('='*40) return result except con.Error as e: if con: print("error is ", e) finally: if con: con.close() def printstockinqry(data):

Page 19: การสร้าง GUI Form ด้วย PyQt และ · 2020-01-18 · ในการใช้งาน Qt Designer เพื่อออกแบบและสร้าง

Python-GUI 19

52 53 54 55 56

msg = '' for row in data: msg = msg + str(row) + "\n" return msg

จากโปรแกรม module_stockin.py อธบายการท างานของโปรแกรมไดดงน

บรรทดท 1 อมพอรตโมดล sqlite3 บรรทดท 4-18 สรางฟงกชน insertstockin() เพอ insert ขอมลสนคาลงในตาราง stockin บรรทดท 21-49 สรางฟงกชน selectallproduct() เพอ select ขอมลจากตาราง stockin และจดรปแบบการ

แสดงผลเพอน าไปใชงาน

Note

บรรทดท 24-28 เปนการ select ขอมลจดกลมตามรหสสนคา โดยใชค าสง sum ส าหรบค านวณจ านวนรวมของสนคาแตละรหส และใชค าสง avg ส าหรบค านวณคาเฉลยของตนทนสนคาทรบเขาในแตละรหส

บรรทดท 52-56 สรางฟงกชน printempqry(data) เพอน าขอมล data มาเชอมตอเปนขอความ msg เพอน าไปใชงาน

5. โปรแกรมควบคมการท างานของหนาจอ loginform (run_login.py) มโคดดงน

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36

from PyQt5.QtWidgets import QWidget, QApplication, QMainWindow, QMessageBox from module_create import * from module_emp import * import data_menus import data_empinsert import loginform import sys class MyApp(QMainWindow): def __init__(self, parent=None): QWidget.__init__(self, parent) self.ui = loginform.Ui_Form() self.ui.setupUi(self) self.ui.loginbutton.clicked.connect(self.get_main_form) self.ui.closebutton.clicked.connect(self.close) self.get_emp_data() def get_emp_data(self): data = selectallemployee(1) if len(data) == 4: QMessageBox.information(self, 'info', 'Add user data first') empinsert_app = data_empinsert.MyApp(self) empinsert_app.ui.tlabel.setVisible(False) empinsert_app.ui.tcombo.setVisible(False) empinsert_app.show() def get_main_form(self): empid = self.ui.usertext.text() emppw = self.ui.pwtext.text() data = selectemployee(empid, emppw) if not data: QMessageBox.information(self, 'info', 'Log in Fail') self.ui.usertext.setFocus() else:

Page 20: การสร้าง GUI Form ด้วย PyQt และ · 2020-01-18 · ในการใช้งาน Qt Designer เพื่อออกแบบและสร้าง

Python-GUI 20

37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59

menu_app = data_menus.MyApp(self) empid = menu_app.windowTitle() + " by " + empid menu_app.setWindowTitle(empid) emptype = 0 for row in data: emptype = row[2] if emptype == 1: menu_app.ui.empinsertbutton.setEnabled(True) menu_app.ui.empqrybutton.setEnabled(True) menu_app.ui.actionemployee.setEnabled(True) else: menu_app.ui.empinsertbutton.setEnabled(False) menu_app.ui.empqrybutton.setEnabled(False) menu_app.ui.actionemployee.setEnabled(False) menu_app.show() if __name__ == '__main__': createTable() app = QApplication(sys.argv) login_app = MyApp() login_app.show() sys.exit(app.exec_())

จากโปรแกรม run_login.py อธบายการท างานของโปรแกรมไดดงน

บรรทดท 1 อมพอรตโมดลเพอใชงาน widget ตางๆ ทอยบน loginform บรรทดท 2-7 อมพอรตโมดลเพอใชงานหนาจอทออกแบบไว บรรทดท 10-51 สรางคลาส MyApp และก าหนดคาเรมตนตางๆ ของ loginform ผานเมธอด __init__ โดยมการตรวจจบเหตการณ ดงน

• คลกทป ม login ตามค าสงบรรทดท 16 เพอเรยกใชเมธอด get_main_form() • คลกทป ม close ตามค าสงบรรทดท 17 เพอเรยกใชค าสง self.close เปนการปด

หนาจอเพอออกจากระบบ • เรยกใชเมธอด get_emp_data() ตามค าสงบรรทดท 18 เพอตรวจสอบขอมลผใช

บรรทดท 20-27 สรางเมธอด get_emp_data() เพอตรวจสอบขอมลผใช โดยเรยกฟงกชน selectallemployee(1) จากโมดล module_emp เพอ select ขอมลผใชทมสถานะ active กรณไมพบขอมล จะมขอความแจงเตอนใหเพมขอมลผใชกอน และโปรแกรมจะแสดงหนาจอเพมขอมลผใช

บรรทดท 29-51 สรางเมธอด get_main_form() เพอตรวจสอบขอมลการเขาสระบบ โดยเรยกฟงกชน selectemployee(empid, emppw) จากโมดล module_emp กรณไมพบขอมล จะมขอความแจงเตอนการเขาสระบบไมส าเรจ กรณทพบขอมล และโปรแกรมจะแสดงหนาจอเมนหลก โดยมการสงคารหสผใชไปตอทายขอความ windowTitle ของหนาจอเมนหลก และตรวจสอบประเภทผใชทเปน user จะไมสามารถจดการขอมลพนกงาน โดยโปรแกรมจะปดการใชงานดวยเมธอด setEnabled ตามค าสงในบรรทดท 48-50

บรรทดท 54-59 เปนสวนโปรแกรมหลกทเรยกใช คลาส MyApp ซงเปนการสงให loginform ท างาน โดยเรยกฟงกชน createTable() จากโมดล module_create ตามค าสงบรรทดท 54 เพอจดการฐานขอมล

Page 21: การสร้าง GUI Form ด้วย PyQt และ · 2020-01-18 · ในการใช้งาน Qt Designer เพื่อออกแบบและสร้าง

Python-GUI 21

6. โปรแกรมควบคมการท างานของหนาจอ menusform (run_menus.py) มโคดดงน 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66

from PyQt5.QtWidgets import QWidget, QMainWindow import menusform import run_productinsert import run_productupdate import run_productqry import run_stockininsert import run_stockinqry import run_empinsert import run_empqry import run_empupdate import sys class MyApp(QMainWindow): def __init__(self, parent=None): QWidget.__init__(self, parent) self.ui = menusform.Ui_MainWindow() self.ui.setupUi(self) self.ui.closebutton.clicked.connect(self.exits) self.ui.empinsertbutton.clicked.connect(self.get_empinsert_form) self.ui.empqrybutton.clicked.connect(self.get_empqry_form) self.ui.pinsertbutton.clicked.connect(self.get_productinsert_form) self.ui.pqrybutton.clicked.connect(self.get_productqry_form) self.ui.stinsertbutton.clicked.connect(self.get_stockininsert_form) self.ui.stqrybutton.clicked.connect(self.get_stockinqry_form) self.ui.actionproduct.triggered.connect(self.get_productupdate_form) self.ui.actionemployee.triggered.connect(self.get_empupdate_form) def get_windowtitle(self): empid = MyApp.windowTitle(self) empid = empid.split(' by ', 2) return empid[1] def get_empinsert_form(self): empinsert_app = run_empinsert.MyApp(self) empinsert_app.show() def get_empqry_form(self): empqry_app = run_empqry.MyApp(self) empqry_app.show() def get_productinsert_form(self): productinsert_app = run_productinsert.MyApp(self) productinsert_app.show() def get_productqry_form(self): productqry_app = run_productqry.MyApp(self) productqry_app.show() def get_stockininsert_form(self): stockininsert_app = run_stockininsert.MyApp(self) empid = self.get_windowtitle() stockininsert_app.ui.emptext.setText(empid) stockininsert_app.show() def get_stockinqry_form(self): stockinqry_app = run_stockinqry.MyApp(self) stockinqry_app.show() def get_productupdate_form(self): productupdate_app = run_productupdate.MyApp(self) productupdate_app.show() def get_empupdate_form(self): empupdate_app = run_empupdate.MyApp(self)

Page 22: การสร้าง GUI Form ด้วย PyQt และ · 2020-01-18 · ในการใช้งาน Qt Designer เพื่อออกแบบและสร้าง

Python-GUI 22

67 68 69 70 71

empupdate_app.show() @staticmethod def exits(): sys.exit(0)

จากโปรแกรม run_menus.py อธบายการท างานของโปรแกรมไดดงน

บรรทดท 1 อมพอรตโมดลเพอใชงาน widget ตางๆ ทอยบน menusform บรรทดท 2-11 อมพอรตโมดลเพอใชงานหนาจอทออกแบบไว บรรทดท 14-71 สรางคลาส MyApp และก าหนดคาเรมตนตางๆ ของ menusform ผานเมธอด __init__ โดยมการตรวจจบเหตการณ ดงน

• คลกทป ม close ตามค าสงบรรทดท 20 เพอเรยกใชเมธอด exits() • คลกทป ม product บนหนาจอเมนหลก ตรงดานซายในสวนของ DATA ตามค าสง

บรรทดท 21 เพอเรยกใชเมธอด get_productinsert_form() • คลกทป ม product บนหนาจอเมนหลก ตรงดานขวาในสวนของ QUERY ตามค าสง

บรรทดท 22 เพอเรยกใชเมธอด get_productqry_form() • คลกทป ม stock in บนหนาจอเมนหลก ตรงดานซายในสวนของ DATA ตามค าสง

บรรทดท 23 เพอเรยกใชเมธอด get_stockininsert _form() • คลกทป ม stock in บนหนาจอเมนหลก ตรงดานขวาในสวนของ QUERY ตามค าสง

บรรทดท 24 เพอเรยกใชเมธอด get_stockinqry _form() • คลกทป ม employee บนหนาจอเมนหลก ตรงดานซายในสวนของ DATA ตามค าสง

บรรทดท 25 เพอเรยกใชเมธอด get_empinsert _form() • คลกทป ม employee บนหนาจอเมนหลก ตรงดานขวาในสวนของ QUERY ตาม

ค าสงบรรทดท 26 เพอเรยกใชเมธอด get_empqry_form() • คลกทเมน update คลกเลอก product ตามค าสงบรรทดท 27 เพอเรยกใชเมธอด

get_productupdate_form() • คลกทเมน update คลกเลอก employee ตามค าสงบรรทดท 28 เพอเรยกใชเมธอด

get_empupdate_form() บรรทดท 30-33 สรางเมธอด get_windowtitle() เพอดงขอมลผใช จากขอความ windowTitle บรรทดท 35-37 สรางเมธอด get_empinsert_form() เพอแสดงหนาจอ insert ขอมลผใช บรรทดท 39-41 สรางเมธอด get_empqry_form() เพอแสดงหนาจอขอมลผใช บรรทดท 43-45 สรางเมธอด get_productinsert_form() เพอแสดงหนาจอ insert ขอมลสนคา บรรทดท 47-49 สรางเมธอด get_productqry_form() เพอแสดงหนาจอขอมลสนคา บรรทดท 51-55 สรางเมธอด get_stockininsert_form() เพอแสดงหนาจอ insert ขอมลสนคาทรบเขา บรรทดท 57-59 สรางเมธอด get_stockinqry_form() เพอแสดงหนาจอขอมลสนคาทรบเขา บรรทดท 61-63 สรางเมธอด get_productupdate_form() เพอแสดงหนาจอ update ขอมลสนคา บรรทดท 65-67 สรางเมธอด get_empupdate_form() เพอแสดงหนาจอ update ขอมลผใช บรรทดท 69-71 สรางเมธอด exits() เพอเรยกใชค าสง sys.exit(0) ใหโปรแกรมจบการท างาน ออกจาก

หนาจอน โดยไมตองกลบไปหนาจอเขาสระบบ

Page 23: การสร้าง GUI Form ด้วย PyQt และ · 2020-01-18 · ในการใช้งาน Qt Designer เพื่อออกแบบและสร้าง

Python-GUI 23

7. โปรแกรมควบคมการท างานของหนาจอ employeeinsertform (run_empinsert.py) มโคดดงน 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48

from PyQt5.QtWidgets import QWidget, QMainWindow, QMessageBox from module_emp import * import employeeinsertform import random class MyApp(QMainWindow): def __init__(self, parent=None): QWidget.__init__(self, parent) self.ui = employeeinsertform.Ui_Form() self.ui.setupUi(self) self.ui.closebutton.clicked.connect(self.close) self.ui.savebutton.clicked.connect(self.save_data) self.get_emp_data() def get_emp_data(self): data = selectlastemployeeid() empid = 0 if data != 0: empid = str(data)[1:] empid = str(int(empid) + 1) if len(empid) == 1: empid = 'E00' + empid if len(empid) == 2: empid = 'E0' + empid if len(empid) == 3: empid = 'E' + empid self.ui.utext.setText(empid) self.ui.tcombo.clear() self.ui.tcombo.addItem('admin') self.ui.tcombo.addItem('user') self.ui.tcombo.currentText = 'admin' pw = random.randrange(1000, 9999) self.ui.ptext.setText(str(pw)) def save_data(self): empid = self.ui.utext.text() emppw = self.ui.ptext.text() emptype = self.ui.tcombo.currentIndex() + 1 insertemployee(empid, emppw, emptype) QMessageBox.information(self, 'info', 'Data Inserted') data = selectallemployee(1) if len(data) > 8: self.get_emp_data() else: QMessageBox.information(self, 'info', 'login data is ' + empid + ';' + emppw)

จากโปรแกรม run_empinsert.py อธบายการท างานของโปรแกรมไดดงน

บรรทดท 1 อมพอรตโมดลเพอใชงาน widget ตางๆ ทอยบน empinsertform บรรทดท 2-3 อมพอรตโมดลเพอใชงานหนาจอทออกแบบไว บรรทดท 4 อมพอรตโมดล random เพอใชงานโมดลการสมตวเลข บรรทดท 7-48 สรางคลาส MyApp และก าหนดคาเรมตนตางๆ ของ empinsertform ผานเมธอด __init__ โดยมการตรวจจบเหตการณ ดงน

• คลกทป ม close ตามค าสงบรรทดท 13 เพอเรยกใชค าสง self.close เปนการปดหนาจอน กลบไปหนาจอเมนหลก

Page 24: การสร้าง GUI Form ด้วย PyQt และ · 2020-01-18 · ในการใช้งาน Qt Designer เพื่อออกแบบและสร้าง

Python-GUI 24

• คลกทป ม save ตามค าสงบรรทดท 14 เพอเรยกใชเมธอด save_data() • เรยกใชเมธอด get_emp_data() ตามค าสงบรรทดท 15 เพอจดเตรยมขอมลส าหรบ

การเพมขอมลผใช บรรทดท 17-35 สรางเมธอด get_emp_data() เพอตรวจสอบขอมลรหสผใชรายการลาสด โดยเรยก

ฟงกชน selectlastemployeeid() จากโมดล module_emp ตามค าสงบรรทดท 18 เพอน ามาสรางรหสผใชอตโนมต และสมตวเลข 4 หลก เปนรหสผาน ตามค าสงบรรทดท 34โดยก าหนดรหสผใชและรหสผานใหกบ widget บนหนาจอน

บรรทดท 37-48 สรางเมธอด save_data() เพอเพมขอมลรหสผใชและรหสผานลงในตาราง employee โดยเรยกฟงกชน insertemployee() จากโมดล module_emp ตามค าสงบรรทดท 41 และจดเตรยมขอมลผใชรายการถดไป

8. โปรแกรมควบคมการท างานของหนาจอ employeeqryform (run_empqry.py) มโคดดงน

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17

from PyQt5.QtWidgets import QWidget, QMainWindow from module_emp import * import employeeqryform class MyApp(QMainWindow): def __init__(self, parent=None): QWidget.__init__(self, parent) self.ui = employeeqryform.Ui_Form() self.ui.setupUi(self) self.ui.closebutton.clicked.connect(self.close) self.load_data() def load_data(self): data = selectallemployee(1) msg = printempqry(data) self.ui.showlist.setText(msg)

จากโปรแกรม run_empqry.py อธบายการท างานของโปรแกรมไดดงน

บรรทดท 1 อมพอรตโมดลเพอใชงาน widget ตางๆ ทอยบน empqryform บรรทดท 2-3 อมพอรตโมดลเพอใชงานหนาจอทออกแบบไว บรรทดท 6-17 สรางคลาส MyApp และก าหนดคาเรมตนตางๆ ของ empqryform ผานเมธอด __init__ โดยมการตรวจจบเหตการณ ดงน

• คลกทป ม close ตามค าสงบรรทดท 11 เพอเรยกใชค าสง self.close เปนการปดหนาจอน กลบไปหนาจอเมนหลก

• เรยกใชเมธอด load_data() ตามค าสงบรรทดท 12 เพอจดเตรยมขอมลส าหรบการแสดงผลขอมลผใช

บรรทด 14-17 สรางเมธอด load_data() เพอ select ขอมลผใชทมสถานะ active โดยเรยกฟงกชน selectallemployee() และ เรยกใชฟงกชน printempqry() จากโมดล module_emp เพอน าขอมลมาแสดงผล widget ทก าหนด ตามค าสงบรรทดท 15-17

9. โปรแกรมควบคมการท างานของหนาจอ employeeupdateform (run_empupdate.py) มโคด

ดงน

Page 25: การสร้าง GUI Form ด้วย PyQt และ · 2020-01-18 · ในการใช้งาน Qt Designer เพื่อออกแบบและสร้าง

Python-GUI 25

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68

from PyQt5.QtWidgets import QWidget, QMainWindow, QMessageBox from module_emp import * import employeeupdateform class MyApp(QMainWindow): idx = 0 active = 1 def __init__(self, parent=None): QWidget.__init__(self, parent) self.ui = employeeupdateform.Ui_Form() self.ui.setupUi(self) self.ui.closebutton.clicked.connect(self.close) self.ui.savebutton.clicked.connect(self.save_data) self.ui.datalist.itemSelectionChanged.connect(self.show_emp_data) self.ui.datalist.doubleClicked.connect(self.delete_data) self.get_emp_data() def get_emp_data(self): data = selectallemployee(0) self.ui.datalist.clear() count = 1 for row in data: if count > 3: if count < len(data)-3: self.ui.datalist.insertItem(count, str(row)) count = count + 1 self.ui.tcombo.clear() self.ui.tcombo.addItem('admin') self.ui.tcombo.addItem('user') self.ui.datalist.setCurrentRow(MyApp.idx) def show_emp_data(self): msg = "" data = self.ui.datalist.selectedItems() for row in data: msg = row.text() data = msg.split(' ', 4) data0 = data[0][1:len(data[0])-1] data1 = data[1][1:len(data[1])-1] data2 = data[2][1:len(data[2])-1] MyApp.active = data[3][1:len(data[3])-1] self.ui.utext.setText(data0) self.ui.ptext.setText(data1) self.ui.tcombo.setCurrentText(data2) def delete_data(self): empid = self.ui.utext.text() if MyApp.active == 'active': msg = 'Delete ' active = 1 else: msg = 'Delete inactive ' active = 0 resp = QMessageBox.question(self, 'confirm', msg + 'Data ?', QMessageBox.Yes | QMessageBox.No, QMessageBox.No) if resp == QMessageBox.Yes: deleteemployee(empid, active) self.close() MyApp.idx = self.ui.datalist.currentRow() MyApp(self).show() def save_data(self):

Page 26: การสร้าง GUI Form ด้วย PyQt และ · 2020-01-18 · ในการใช้งาน Qt Designer เพื่อออกแบบและสร้าง

Python-GUI 26

69 70 71 72 73 74 75 76

empid = self.ui.utext.text() emppw = self.ui.ptext.text() emptype = self.ui.tcombo.currentIndex() updateemployee(empid, emppw, (emptype+1)) QMessageBox.information(self, 'info', 'Data Updated') self.close() MyApp.idx = self.ui.datalist.currentRow() MyApp(self).show()

จากโปรแกรม run_empupdate.py อธบายการท างานของโปรแกรมไดดงน

บรรทดท 1 อมพอรตโมดลเพอใชงาน widget ตางๆ ทอยบน empupdateform บรรทดท 2-3 อมพอรตโมดลเพอใชงานหนาจอทออกแบบไว บรรทดท 6-76 สรางคลาส MyApp และก าหนดคาเรมตนตางๆ ของ empupdateform ผานเมธอด

__init__ โดยมการตรวจจบเหตการณ ดงน • คลกทป ม close ตามค าสงบรรทดท 15 เพอเรยกใชค าสง self.close เปนการปด

หนาจอน กลบไปหนาจอเมนหลก • คลกทป ม save ตามค าสงบรรทดท 16 เพอเรยกใชเมธอด save_data() • คลกเลอกท datalist ตามค าสงบรรทดท 17 เพอเรยกใชเมธอด show_emp_data() • ดบเบลคลกท datalist ตามค าสงบรรทดท 18 เพอเรยกใชเมธอด delete_data() • เรยกใชเมธอด get_emp_data() ตามค าสงบรรทดท 19 เพอจดเตรยมขอมลใน

datalist เพอใชส าหรบการแกไขขอมลผใช บรรทดท 21-33 สรางเมธอด get_emp_data() เพอ select ขอมลผใชทงหมด โดยเรยกฟงกชน

selectallemployee() จากโมดล module_emp ตามค าสงบรรทดท 22 เพอน าขอมลแสดงใน datalist

บรรทดท 35-49 สรางเมธอด show_emp_data() เพอน าขอมลทคลกเลอกจาก datalist มาแสดงท widget ในแตละต าแหนง เพอใหสามารถแกไขขอมลได

บรรทดท 51-66 สรางเมธอด delete_data() เพอลบขอมลผใชทดบคลกเลอกจาก datalist โดยเรยกฟงกชน deleteemployee() จากโมดล module_emp ตามค าสงบรรทดท 63 และมการรเฟรชขอมลดวยการปดและเปดหนาจอนใหมตามค าสงบรรทดท 64-66

บรรทดท 68-76 สรางเมธอด save_data() เพอ update ขอมลประเภทผใชและรหสผานลงในตาราง employee โดยเรยกฟงกชน updateemployee() จากโมดล module_emp ตามค าสงบรรทดท 72 และมการรเฟรชขอมลดวยการปดและเปดหนาจอนใหมตามค าสงบรรทดท 74-76

10. โปรแกรมควบคมการท างานของหนาจอ productinsertform (run_productinsert.py) มโคดดงน

1 2 3 4 5 6 7 8 9 10 11

from PyQt5.QtWidgets import QWidget, QMainWindow, QMessageBox, QFileDialog from PyQt5 import QtGui from module_product import * import productinsertform class MyApp(QMainWindow): def __init__(self, parent=None): QWidget.__init__(self, parent) self.ui = productinsertform.Ui_Form() self.ui.setupUi(self)

Page 27: การสร้าง GUI Form ด้วย PyQt และ · 2020-01-18 · ในการใช้งาน Qt Designer เพื่อออกแบบและสร้าง

Python-GUI 27

12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56

self.ui.closebutton.clicked.connect(self.close) self.ui.savebutton.clicked.connect(self.save_data) self.ui.browsebutton.clicked.connect(self.getpic) self.get_p_data() def get_p_data(self): data = selectlastproductid() pid = 0 if data != 0: pid = str(data)[1:] pid = str(int(pid) + 1) if len(pid) == 1: pid = 'P00' + pid if len(pid) == 2: pid = 'P0' + pid if len(pid) == 3: pid = 'P' + pid self.ui.itext.setText(pid) self.ui.ntext.clear() self.ui.qtext.clear() self.ui.ctext.clear() self.ui.pictext.clear() self.ui.piclabel.setPixmap(QtGui.QPixmap('None')) self.ui.piclabel.setText('Picture File') self.ui.ntext.setFocus() def getpic(self): filename = QFileDialog.getOpenFileName(self, 'Open file', 'pic/') filename = filename[0] start = filename.find("pic/", 1) + 4 stop = len(filename) picname = filename[start:stop] self.ui.pictext.setText(picname) self.ui.piclabel.setPixmap(QtGui.QPixmap(filename)) def save_data(self): pid = self.ui.itext.text() pname = self.ui.ntext.text() qtyA = self.ui.qtext.text() pcost = self.ui.ctext.text() ppic = self.ui.pictext.text() insertproduct(pid, pname, qtyA, pcost, ppic) QMessageBox.information(self, 'info', 'Data Inserted') self.get_p_data()

จากโปรแกรม run_productinsert.py อธบายการท างานของโปรแกรมไดดงน

บรรทดท 1-2 อมพอรตโมดลเพอใชงาน widget ตางๆ ทอยบน productinsertform บรรทดท 3-4 อมพอรตโมดลเพอใชงานหนาจอทออกแบบไว บรรทดท 7-56 สรางคลาส MyApp และก าหนดคาเรมตนตางๆ ของ productinsertform ผานเมธอด

__init__ โดยมการตรวจจบเหตการณ ดงน • คลกทป ม close ตามค าสงบรรทดท 13 เพอเรยกใชค าสง self.close เปนการปด

หนาจอน กลบไปหนาจอเมนหลก • คลกทป ม save ตามค าสงบรรทดท 14 เพอเรยกใชเมธอด save_data() • คลกทป ม browse ตามค าสงบรรทดท 15 เพอเรยกใชเมธอด getpic() • เรยกใชเมธอด get_p_data() ตามค าสงบรรทดท 16 เพอจดเตรยมขอมลส าหรบการ

เพมขอมลสนคา

Page 28: การสร้าง GUI Form ด้วย PyQt และ · 2020-01-18 · ในการใช้งาน Qt Designer เพื่อออกแบบและสร้าง

Python-GUI 28

บรรทดท 18-37 สรางเมธอด get_p_data() เพอตรวจสอบขอมลรหสสนคารายการลาสด โดยเรยกฟงกชน selectlastproductid() จากโมดล module_product ตามค าสงบรรทดท 19 เพอน ามาสรางรหสสนคาอตโนมต และก าหนดใหกบ widget บนหนาจอน

บรรทดท 38-46 สรางเมธอด getpic() เพอเลอกไฟลภาพสนคา และก าหนดชอไฟลใหกบ widget บนหนาจอน และแสดงภาพบน piclabel ดวยเมธอด setPixmap() ตามค าสงบรรทดท 46

บรรทดท 48-56 สรางเมธอด save_data() เพอเพมขอมลสนคาลงในตาราง product โดยเรยกฟงกชน insertproduct() จากโมดล module_product ตามค าสงบรรทดท 54 และจดเตรยมขอมลส าหรบรายการถดไป

11. โปรแกรมควบคมการท างานของหนาจอ productqryform (run_productqry.py) มโคดดงน

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17

from PyQt5.QtWidgets import QWidget, QMainWindow from module_product import * import productqryform class MyApp(QMainWindow): def __init__(self, parent=None): QWidget.__init__(self, parent) self.ui = productqryform.Ui_Form() self.ui.setupUi(self) self.ui.closebutton.clicked.connect(self.close) self.load_data() def load_data(self): data = selectallproduct(1) msg = printproductqry(data) self.ui.showlist.setText(msg)

จากโปรแกรม run_productqry.py อธบายการท างานของโปรแกรมไดดงน

บรรทดท 1 อมพอรตโมดลเพอใชงาน widget ตางๆ ทอยบน productqryform บรรทดท 2-3 อมพอรตโมดลเพอใชงานหนาจอทออกแบบไว บรรทดท 6-17 สรางคลาส MyApp และก าหนดคาเรมตนตางๆ ของ productqryform ผานเมธอด __init__

โดยมการตรวจจบเหตการณ ดงน • คลกทป ม close ตามค าสงบรรทดท 11 เพอเรยกใชค าสง self.close เปนการปด

หนาจอน กลบไปหนาจอเมนหลก • เรยกใชเมธอด load_data() ตามค าสงบรรทดท 12 เพอจดเตรยมขอมลส าหรบการ

แสดงผลขอมลสนคา บรรทด 14-17 สรางเมธอด load_data() เพอ select ขอมทงหมด โดยเรยกฟงกชน selectallproduct()

และเรยกใชฟงกชน printproductqry() จากโมดล module_product เพอน าขอมลมาแสดงผล widget ทก าหนดตามค าสงบรรทดท 15-17

12. โปรแกรมควบคมการท างานของหนาจอ productupdateform (run_productupdate.py) มโคด

ดงน 1 2 3 4

from PyQt5.QtWidgets import QWidget, QMainWindow, QMessageBox, QFileDialog from PyQt5 import QtGui from module_product import * import productupdateform

Page 29: การสร้าง GUI Form ด้วย PyQt และ · 2020-01-18 · ในการใช้งาน Qt Designer เพื่อออกแบบและสร้าง

Python-GUI 29

5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70

class MyApp(QMainWindow): idx = 0 def __init__(self, parent=None): QWidget.__init__(self, parent) self.ui = productupdateform.Ui_Form() self.ui.setupUi(self) self.ui.closebutton.clicked.connect(self.close) self.ui.savebutton.clicked.connect(self.save_data) self.ui.browsebutton.clicked.connect(self.getpic) self.ui.datalist.itemSelectionChanged.connect(self.show_p_data) self.get_p_data() def get_p_data(self): data = selectallproduct(2) self.ui.datalist.clear() count = 1 for row in data: if count > 3: if count < len(data) - 3: self.ui.datalist.insertItem(count, str(row)) count = count + 1 self.ui.datalist.setCurrentRow(MyApp.idx) def getpic(self): filename = QFileDialog.getOpenFileName(self, 'Open file', 'pic/') filename = filename[0] start = filename.find("pic/", 1) + 4 stop = len(filename) picname = filename[start:stop] self.ui.pictext.setText(picname) self.ui.piclabel.setPixmap(QtGui.QPixmap(filename)) def show_p_data(self): msg = "" data = self.ui.datalist.selectedItems() for row in data: msg = row.text() data = msg.split(' ', 6) data0 = data[0][1:len(data[0])-1] data1 = data[1][1:len(data[1])-1] data2 = data[2][1:len(data[2])-1].replace(',', '') data3 = data[3][1:len(data[3])-1] data4 = data[4][1:len(data[4])-1] filename = "pic/" + data4 self.ui.piclabel.setPixmap(QtGui.QPixmap(filename)) self.ui.pictext.setText(data4) self.ui.itext.setText(data0) self.ui.ntext.setText(data1) self.ui.qtext.setText(data2) self.ui.ctext.setText(data3) def save_data(self): pid = self.ui.itext.text() pname = self.ui.ntext.text() pqty = self.ui.qtext.text() pcost = self.ui.ctext.text() ppic = self.ui.pictext.text() updateproduct(pid, pname, pqty, pcost, ppic) QMessageBox.information(self, 'info', 'Data Updated') MyApp.idx = self.ui.datalist.currentRow() self.close() MyApp(self).show()

Page 30: การสร้าง GUI Form ด้วย PyQt และ · 2020-01-18 · ในการใช้งาน Qt Designer เพื่อออกแบบและสร้าง

Python-GUI 30

จากโปรแกรม run_productupdate.py อธบายการท างานของโปรแกรมไดดงน

บรรทดท 1-2 อมพอรตโมดลเพอใชงาน widget ตางๆ ทอยบน productupdateform บรรทดท 3-4 อมพอรตโมดลเพอใชงานหนาจอทออกแบบไว บรรทดท 7-70 สรางคลาส MyApp และก าหนดคาเรมตนตางๆ ของ productupdateform ผานเมธอด

__init__ โดยมการตรวจจบเหตการณ ดงน • คลกทป ม close ตามค าสงบรรทดท 14 เพอเรยกใชค าสง self.close เปนการปด

หนาจอน กลบไปหนาจอเมนหลก • คลกทป ม save ตามค าสงบรรทดท 15 เพอเรยกใชเมธอด save_data() • คลกทป ม browse ตามค าสงบรรทดท 16 เพอเรยกใชเมธอด getpic() • คลกเลอกท datalist ตามค าสงบรรทดท 17 เพอเรยกใชเมธอด show_emp_data() • เรยกใชเมธอด get_p_data() ตามค าสงบรรทดท 18 เพอจดเตรยมขอมลส าหรบการ

แกไขขอมลสนคา บรรทดท 20-29 สรางเมธอด get_p_data() เพอ select ขอมลสนคาทงหมด โดยเรยกฟงกชน

selectallproduct() จากโมดล module_product ตามค าสงบรรทดท 21 เพอน ามาแสดงใน datalist

บรรทดท 31-38 สรางเมธอด getpic() เพอเลอกไฟลภาพสนคา และก าหนดชอไฟลใหกบ widget บนหนาจอน

บรรทดท 40-58 สรางเมธอด show_p_data() เพอน าขอมลทคลกเลอกจาก datalist มาแสดงท widget ในแตละต าแหนง เพอใหสามารถแกไขขอมลได

บรรทดท 60-70 สรางเมธอด save_data() เพอ update ขอมลสนคาลงในตาราง product โดยเรยกฟงกชน updateproduct() จากโมดล module_product ตามค าสงบรรทดท 45 และมการรเฟรชขอมลดวยการปดและเปดหนาจอนใหม ตามค าสงบรรทดท 69-70

13. โปรแกรมควบคมการท างานของหนาจอ stockininsertform (run_stockininsert.py) มโคดดงน

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24

from PyQt5.QtWidgets import QWidget, QMainWindow, QMessageBox from PyQt5 import QtCore from module_product import * from module_stockin import * import stockininsertform class MyApp(QMainWindow): idx = 0 ppic = '' empid = '' def __init__(self, parent=None): QWidget.__init__(self, parent) self.ui = stockininsertform.Ui_Form() self.ui.setupUi(self) self.ui.closebutton.clicked.connect(self.close) self.ui.savebutton.clicked.connect(self.save_data) self.ui.datalist.itemSelectionChanged.connect(self.show_p_data) self.get_st_date() self.get_p_data() def get_st_date(self): if self.ui.emptext.setText(MyApp.empid) == '':

Page 31: การสร้าง GUI Form ด้วย PyQt และ · 2020-01-18 · ในการใช้งาน Qt Designer เพื่อออกแบบและสร้าง

Python-GUI 31

25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78

self.ui.emptext.setText(MyApp.empid) self.ui.datetext.setDateTime(QtCore.QDateTime.currentDateTime()) def get_p_data(self): data = selectallproduct(2) self.ui.datalist.clear() count = 1 for row in data: if count > 3: if count < len(data) - 3: self.ui.datalist.insertItem(count, str(row)) count = count + 1 self.ui.datalist.setCurrentRow(MyApp.idx) def show_p_data(self): data = self.ui.datalist.selectedItems() msg = '' for row in data: msg = row.text() data = msg.split(' ', 5) data0 = data[0][1:len(data[0])-1] data1 = data[1][1:len(data[1])-1] data2 = data[2][1:len(data[2])-1].replace(',', '') data3 = data[3][1:len(data[3])-1] data4 = data[4][1:len(data[4])-1] MyApp.ppic = data4 self.ui.pitext.setText(data0) self.ui.pntext.setText(data1) self.ui.pqtext.setText(str(data2)) self.ui.pctext.setText(str(data3)) self.ui.qtext.setFocus() def save_data(self): MyApp.empid = self.ui.emptext.text() indate = self.ui.datetext.text() pid = self.ui.pitext.text() pname = self.ui.pntext.text() pqty = int(self.ui.pqtext.text()) pcost = float(self.ui.pctext.text()) stqty = int(self.ui.qtext.text()) stcost = float(self.ui.costtext.text()) newcost = ((pqty * pcost) + (stqty * stcost)) / (pqty + stqty) pqty = pqty + stqty insertstockin(indate, pid, MyApp.empid, stqty, stcost) updateproduct(pid, pname, pqty, newcost, MyApp.ppic) QMessageBox.information(self, 'info', 'Data Inserted') MyApp.idx = self.ui.datalist.currentRow() self.close() MyApp(self).show()

จากโปรแกรม run_stockininsert.py อธบายการท างานของโปรแกรมไดดงน

บรรทดท 1-2 อมพอรตโมดลเพอใชงาน widget ตางๆ ทอยบน stockininsertform บรรทดท 3-5 อมพอรตโมดลเพอใชงานหนาจอทออกแบบไว บรรทดท 8-78 สรางคลาส MyApp และก าหนดคาเรมตนตางๆ ของ stockininsertform ผานเมธอด

__init__ โดยมการตรวจจบเหตการณ ดงน

Page 32: การสร้าง GUI Form ด้วย PyQt และ · 2020-01-18 · ในการใช้งาน Qt Designer เพื่อออกแบบและสร้าง

Python-GUI 32

• คลกทป ม close ตามค าสงบรรทดท 17 เพอเรยกใชค าสง self.close เปนการปดหนาจอน กลบไปหนาจอเมนหลก

• คลกทป ม save ตามค าสงบรรทดท 18 เพอเรยกใชเมธอด save_data() • คลกเลอกท datalist ตามค าสงบรรทดท 19 เพอเรยกใชเมธอด show_p_data() • เรยกใชเมธอด get_st_data() ตามค าสงบรรทดท 20 เพอแสดงวนทปจจบน • เรยกใชเมธอด get_p_data() ตามค าสงบรรทดท 21 เพอจดเตรยมขอมลไวใน

datalist บรรทดท 28-37 สรางเมธอด get_p_data() เพอ select ขอมลสนคาทงหมด โดยเรยกฟงกชน

selectallproduct() จากโมดล module_product ตามค าสงบรรทดท 29 และน ามาแสดงใน datalist

บรรทดท 39-57 สรางเมธอด show_p_data() เพอน าขอมลทคลกเลอกจาก datalist มาแสดงท widget ในแตละต าแหนง เพอใหสามารถแกไขขอมลได

บรรทดท 59-78 สรางเมธอด save_data() เพอเพมขอมลสนคาทรบเขาลงในตาราง stockin โดยเรยกฟงกชน insertstockin() จากโมดล module_stockin ตามค าสงบรรทดท 73 และ update ขอมลสนคาลงในตาราง product โดยเรยกฟงกชน updateproduct() จากโมดล module_product ตามค าสงบรรทดท 74 ซงจะมการค านวณตนทนสนคาเฉลยตามค าสงบรรทดท 64-70 และมการรเฟรชขอมลดวยการปดและเปดหนาจอนใหมตามค าสงบรรทดท 77-78

14. โปรแกรมควบคมการท างานของหนาจอ stockinqryform (run_stockinqry.py) มโคดดงน

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17

from PyQt5.QtWidgets import QWidget, QMainWindow from module_stockin import * import stockinqryform class MyApp(QMainWindow): def __init__(self, parent=None): QWidget.__init__(self, parent) self.ui = stockinqryform.Ui_Form() self.ui.setupUi(self) self.ui.closebutton.clicked.connect(self.close) self.load_data() def load_data(self): data = selectallstockin() msg = printstockinqry(data) self.ui.showlist.setText(msg)

จากโปรแกรม run_stockinqry.py อธบายการท างานของโปรแกรมไดดงน

บรรทดท 1 อมพอรตโมดลเพอใชงาน widget ตางๆ ทอยบน stockinqryform บรรทดท 2-3 อมพอรตโมดลเพอใชงานหนาจอทออกแบบไว บรรทดท 6-17 สรางคลาส MyApp และก าหนดคาเรมตนตางๆ ของ stockinqryform ผานเมธอด __init__

โดยมการตรวจจบเหตการณ ดงน • คลกทป ม close ตามค าสงบรรทดท 11 เพอเรยกใชค าสง self.close เปนการปด

หนาจอน กลบไปหนาจอเมนหลก

Page 33: การสร้าง GUI Form ด้วย PyQt และ · 2020-01-18 · ในการใช้งาน Qt Designer เพื่อออกแบบและสร้าง

Python-GUI 33

• เรยกใชเมธอด load_data() ตามค าสงบรรทดท 12 เพอจดเตรยมขอมลส าหรบการแสดงผลขอมลสนคาทรบเขา

บรรทด 14-17 สรางเมธอด load_data() เพอ select ขอมทงหมด โดยเรยกฟงกชน selectallstockin() และเรยกใชฟงกชน printstockinqry() จากโมดล module_stockin เพอน าขอมลมาแสดงผล widget ทก าหนดตามค าสงบรรทดท 15-17

ผลการท างานของโปรแกรม

ในการรนโปรแกรม จะตองเรยกใชงานโปรแกรมโดยเรมตนจากโปรแกรม run_login.py และผลการท างานของโปรแกรมแสดงไดดงน

1. โปรแกรมจะแสดงหนาตางแจงเตอนใหเพมขอมลผใชในกรณทใชงานครงแรก จากนนคลกปม

2. โปรแกรมจะแสดงหนาจอจดการเพมขอมล โดยโปรแกรมจะสรางรหสผใชใหอตโนมต และจะสม

รหสผานตวเลข 4 หลก จากนนคลกป ม

3. โปรแกรมจะบนทกขอมลลงตาราง employee และแสดงหนาตางแจงวา ขอมลไดถกเพมแลว จากนนคลกป ม

Page 34: การสร้าง GUI Form ด้วย PyQt และ · 2020-01-18 · ในการใช้งาน Qt Designer เพื่อออกแบบและสร้าง

Python-GUI 34

4. โปรแกรมจะแสดงหนาตางแจงขอมลส าหรบการ login จากนนคลกทป ม

5. โปรแกรมจะแสดงหนาจอส าหรบการ login ในกรณทตองการออกจากระบบใหคลกปม

6. ในกรณทตองการเขาสระบบ ใหปอนขอมลรหสผใชและรหสผาน และคลกป ม

7. โปรแกรมจะแสดงหนาจอเมนหลก ในกรณทตองการออกจากระบบ ใหคลกป ม

Page 35: การสร้าง GUI Form ด้วย PyQt และ · 2020-01-18 · ในการใช้งาน Qt Designer เพื่อออกแบบและสร้าง

Python-GUI 35

8. ในกรณทตองการจดการขอมล employee ใหคลกป ม ดานซายทเปนสวนของ DATA ในหนาจอเมนหลก

9. โปรแกรมจะแสดงหนาจอจดการเพมขอมล โดยโปรแกรมจะสรางรหสผใชใหอตโนมต และจะสม

รหสผานตวเลข 4 หลก ในทนเลอกประเภทผใชเปน admin และคลกป ม โปรแกรมจะบนทกขอมลลงตาราง employee

10. จากนนเพมขอมลอก 1 รายการ แตใหเลอกประเภทผใชเปน user และคลกป ม

โปรแกรมจะบนทกขอมลลงตาราง employee ใหคลกปม เพอออกจากหนาจอน กลบไปหนาจอเมนหลก

Page 36: การสร้าง GUI Form ด้วย PyQt และ · 2020-01-18 · ในการใช้งาน Qt Designer เพื่อออกแบบและสร้าง

Python-GUI 36

11. โปรแกรมจะแสดงหนาจอเมนหลก ในกรณทตองการดขอมลใหคลกป ม ดานขวา ทเปนสวนของ QUERY

12. โปรแกรมจะแสดงขอมลผใชทงหมดทมสถานะ active ใหคลกปม เพอออกจากหนาจอน กลบไปหนาจอเมนหลก

13. โปรแกรมจะแสดงหนาจอเมนหลก ในกรณทตองการ update ขอมล ใหคลกเมน update เลอก employee

Page 37: การสร้าง GUI Form ด้วย PyQt และ · 2020-01-18 · ในการใช้งาน Qt Designer เพื่อออกแบบและสร้าง

Python-GUI 37

14. โปรแกรมจะแสดงหนาจอจดการแกไขหรอลบขอมล ใหคลกรายการทตองการแกไข ขอมลจะถกแสดงในต าแหนงของ widget โดยขอมลทแกไขไดคอ รหสผาน เมอแกไขขอมลแลวใหคลก

ป ม และป ม โปรแกรมจะบนทกขอมลลงตาราง employee

15. โปรแกรมจะแสดงขอมลทถกแกไขแลว ในกรณทตองการลบขอมล ใหดบเบลคลกรายการท

ตองการ แลวโปรแกรมจะแสดงขอความแจงเตอน ใหคลกปม

16. โปรแกรมจะแสดงขอมลทถกลบ โดยจะเปลยนสถานะจาก active เปน inactive ใหดบเบลคลก

ซ าทรายการทตองการแลวโปรแกรมจะแสดงขอความแจงเตอน ใหคลกปม

Page 38: การสร้าง GUI Form ด้วย PyQt และ · 2020-01-18 · ในการใช้งาน Qt Designer เพื่อออกแบบและสร้าง

Python-GUI 38

17. โปรแกรมจะไมแสดงขอมลทถกลบไปแลว เนองจากขอมลถก delete จากตาราง employee

แลว ใหคลกป ม เพอออกจากหนาจอน กลบไปหนาจอเมนหลก

18. ในกรณทตองการจดการขอมล product ใหคลกปม ดานซายทเปนสวนของ DATA ในหนาจอเมนหลก

19. โปรแกรมจะแสดงหนาจอจดการเพมขอมล โดยโปรแกรมจะสรางรหสสนคาใหอตโนมต ปอน

ขอมลรายละเอยดสนคา และคลกป ม เพอเลอกไฟลภาพสนคา จากนนคลกป ม

โปรแกรมจะบนทกขอมลลงตาราง product

Page 39: การสร้าง GUI Form ด้วย PyQt และ · 2020-01-18 · ในการใช้งาน Qt Designer เพื่อออกแบบและสร้าง

Python-GUI 39

20. จากนนเพมขอมลอก 2 รายการ (ในทนเปนเพยงตวอยาง สามารถเพมขอมลหรอรปเปนสนคาอนกได) และหลงจากทโปรแกรมบนทกขอมลลงตาราง product แลว ใหคลกป ม เพอออกจากหนาจอน กลบไปหนาจอเมนหลก

21. โปรแกรมจะแสดงหนาจอเมนหลก ในกรณทตองการดขอมลใหคลกป ม ดานขวา ทเปนสวนของ QUERY

22. โปรแกรมจะแสดงขอมลผใชทงหมดทมสถานะ active ในกรณทตองการออกจากหนาจอน ให

คลกป ม

Page 40: การสร้าง GUI Form ด้วย PyQt และ · 2020-01-18 · ในการใช้งาน Qt Designer เพื่อออกแบบและสร้าง

Python-GUI 40

23. โปรแกรมจะแสดงหนาจอเมนหลก ในกรณทตองการ update ขอมล ใหคลกเมน update คลกเลอก product

24. โปรแกรมจะแสดงหนาจอจดการแกไขขอมล ใหคลกรายการทตองการแกไข ขอมลจะถกแสดงบนชอง widget โดยขอมลทแกไขไดคอ ชอสนคา จ านวนสนคา ราคาตนทนสนคา และชอไฟล

ภาพสนคา เมอแกไขขอมลแลวใหคลกป ม และ โปรแกรมจะบนทกขอมลลงตาราง product

25. โปรแกรมจะแสดงขอมลทถกแกไขแลว ใหคลกป ม เพอออกจากหนาจอน กลบไปหนาจอเมนหลก

Page 41: การสร้าง GUI Form ด้วย PyQt และ · 2020-01-18 · ในการใช้งาน Qt Designer เพื่อออกแบบและสร้าง

Python-GUI 41

26. โปรแกรมจะแสดงหนาจอเมนหลก ในกรณทตองการดขอมลใหคลกป ม ดานขวา ทเปนสวนของ QUERY

27. โปรแกรมจะแสดงขอมลทงหมด ใหคลกปม เพอออกจากหนาจอน กลบไปหนาจอเมนหลก

28. ในกรณทตองการจดการขอมล stockin ใหคลกปม ดานซายทเปนสวนของ DATA ในหนาจอเมนหลก

29. โปรแกรมจะแสดงหนาจอจดการเพมขอมล คลกเลอกรายการสนคาทตองการรบเขาจากProduct List ดานขวา ขอมลจะถกแสดงในต าแหนงของ widget ตางๆ ใหปอนขอมล

รายละเอยดสนคาทรบเขา แลวคลกป ม และป ม โปรแกรมจะบนทก

Page 42: การสร้าง GUI Form ด้วย PyQt และ · 2020-01-18 · ในการใช้งาน Qt Designer เพื่อออกแบบและสร้าง

Python-GUI 42

ขอมลลงตาราง stockin โดยตนทนสนคาทรบเขา 145 บาท นน โปรแกรมจะค านวณตนทนสนคาเฉลยจากเดม 135 บาท ไดตนทนสนคาเฉลยเปน 140 บาท

30. จากนนเพมขอมลอก 2 รายการ (ในทนเปนเพยงตวอยาง สามารถเพมขอมลหรอรปเปนสนคา

อนกได) และหลงจากทโปรแกรมบนทกขอมลลงตาราง stockin แลว ใหคลกป ม เพอออกจากหนาจอน กลบไปหนาจอเมนหลก

31. โปรแกรมจะแสดงหนาจอเมนหลก ในกรณทตองการดขอมลใหคลกป ม ดานขวา ทเปนสวนของ QUERY

Page 43: การสร้าง GUI Form ด้วย PyQt และ · 2020-01-18 · ในการใช้งาน Qt Designer เพื่อออกแบบและสร้าง

Python-GUI 43

32. โปรแกรมจะแสดงขอมลทรบเขา โดยมการจดกลมรวมจ านวนสนคาทมรหสเดยวกน และแสดงตนทนสนคาเปนตนทนสนคาเฉลย ในกรณทตองการออกจากหนาจอน ใหคลกป ม

33. โปรแกรมจะแสดงหนาจอเมนหลก ในกรณทตองการออกจากระบบ ใหคลกป ม

สรปทายบท

ในบทนไดเรยนรการใชเครองมอ Qt Designer สราง GUI Form แบบลากวาง widget ตางๆ เพอจดการสรางแตละหนาจอ ซงสามารถท าไดงายและสะดวกรวดเรว เปนการลดขนตอนของการเขยนชดค าสงในสวนของการสรางหนาจอ โดยผเขยนไดอธบายถงขนตอนการตดตงโมดล PyQt และ Qt Designer การแปลง GUI Form เปนไฟลภาษา Python และการเขยนค าสงผานโมดล PyQt5 เพอให GUI Form ของแตละหนาจอสามารถท างานได

นอกจากนยงไดเรยนรข นตอนการเขยนค าสงตรวจจบเหตการณเพอควบคมการท างานของ widget ตางๆ ผานตวอยางประยกต ซงสามารถศกษา และน าไปประยกตใชกบงานจรงได