การสร้าง GUI Form ด้วย PyQt และ · 2020-01-18 ·...
Transcript of การสร้าง GUI Form ด้วย PyQt และ · 2020-01-18 ·...
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
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
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 ซงจะไดศกษาในหวขอถดไป
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 ดงน
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)
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\
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 ทสรางขนสามารถแสดงผลเปนหนาจอการท างานแลว ขนตอนตอไปจะเปนการเขยนโปรแกรมควบคมการท างานตามเหตการณตางๆ เชน การคลกป ม, การเลอกรายการ เปนตน
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
Python-GUI 9
6. ตนทนสนคา stcost ชนดตวเลขทศนยม REAL ในสวนของการเขยนโปรแกรมเพอจดการขอมลการรบสนคาเขาในคลงสนคา มข นตอน ดงน
1. ออกแบบ GUI Form เพอใชงาน ทงหมด 10 หนาจอ ดงน • loginform.ui เปนหนาจอส าหรบการเขาสระบบ
• menusform.ui เปนหนาจอแสดงเมนและปมเพอเขาใชงานในสวนตางๆ
• employeeinsertform.ui เปนหนาจอส าหรบการจดการเพมขอมลผใช
• employeeqryform.ui เปนหนาจอส าหรบการแสดงขอมลผใชทงหมด
Python-GUI 10
• employeeupdateform.ui เปนหนาจอส าหรบการแกไข และลบขอมลผใช
• productinsertform.ui เปนหนาจอส าหรบการจดการเพมขอมลสนคา
• productqryform.ui เปนหนาจอส าหรบการแสดงขอมลสนคาทงหมด
• productupdateform.ui เปนหนาจอส าหรบการแกไข และลบขอมลสนคา
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 จดการขอมลผใช
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) + ')'
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')
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)
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')
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()
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 และจดรปแบบ
การแสดงผลเพอน าไปใชงาน
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):
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:
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 เพอจดการฐานขอมล
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)
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) ใหโปรแกรมจบการท างาน ออกจาก
หนาจอน โดยไมตองกลบไปหนาจอเขาสระบบ
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 เปนการปดหนาจอน กลบไปหนาจอเมนหลก
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) มโคด
ดงน
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):
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)
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 เพอจดเตรยมขอมลส าหรบการ
เพมขอมลสนคา
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
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()
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) == '':
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__ โดยมการตรวจจบเหตการณ ดงน
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 เปนการปด
หนาจอน กลบไปหนาจอเมนหลก
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 และแสดงหนาตางแจงวา ขอมลไดถกเพมแลว จากนนคลกป ม
Python-GUI 34
4. โปรแกรมจะแสดงหนาตางแจงขอมลส าหรบการ login จากนนคลกทป ม
5. โปรแกรมจะแสดงหนาจอส าหรบการ login ในกรณทตองการออกจากระบบใหคลกปม
6. ในกรณทตองการเขาสระบบ ใหปอนขอมลรหสผใชและรหสผาน และคลกป ม
7. โปรแกรมจะแสดงหนาจอเมนหลก ในกรณทตองการออกจากระบบ ใหคลกป ม
Python-GUI 35
8. ในกรณทตองการจดการขอมล employee ใหคลกป ม ดานซายทเปนสวนของ DATA ในหนาจอเมนหลก
9. โปรแกรมจะแสดงหนาจอจดการเพมขอมล โดยโปรแกรมจะสรางรหสผใชใหอตโนมต และจะสม
รหสผานตวเลข 4 หลก ในทนเลอกประเภทผใชเปน admin และคลกป ม โปรแกรมจะบนทกขอมลลงตาราง employee
10. จากนนเพมขอมลอก 1 รายการ แตใหเลอกประเภทผใชเปน user และคลกป ม
โปรแกรมจะบนทกขอมลลงตาราง employee ใหคลกปม เพอออกจากหนาจอน กลบไปหนาจอเมนหลก
Python-GUI 36
11. โปรแกรมจะแสดงหนาจอเมนหลก ในกรณทตองการดขอมลใหคลกป ม ดานขวา ทเปนสวนของ QUERY
12. โปรแกรมจะแสดงขอมลผใชทงหมดทมสถานะ active ใหคลกปม เพอออกจากหนาจอน กลบไปหนาจอเมนหลก
13. โปรแกรมจะแสดงหนาจอเมนหลก ในกรณทตองการ update ขอมล ใหคลกเมน update เลอก employee
Python-GUI 37
14. โปรแกรมจะแสดงหนาจอจดการแกไขหรอลบขอมล ใหคลกรายการทตองการแกไข ขอมลจะถกแสดงในต าแหนงของ widget โดยขอมลทแกไขไดคอ รหสผาน เมอแกไขขอมลแลวใหคลก
ป ม และป ม โปรแกรมจะบนทกขอมลลงตาราง employee
15. โปรแกรมจะแสดงขอมลทถกแกไขแลว ในกรณทตองการลบขอมล ใหดบเบลคลกรายการท
ตองการ แลวโปรแกรมจะแสดงขอความแจงเตอน ใหคลกปม
16. โปรแกรมจะแสดงขอมลทถกลบ โดยจะเปลยนสถานะจาก active เปน inactive ใหดบเบลคลก
ซ าทรายการทตองการแลวโปรแกรมจะแสดงขอความแจงเตอน ใหคลกปม
Python-GUI 38
17. โปรแกรมจะไมแสดงขอมลทถกลบไปแลว เนองจากขอมลถก delete จากตาราง employee
แลว ใหคลกป ม เพอออกจากหนาจอน กลบไปหนาจอเมนหลก
18. ในกรณทตองการจดการขอมล product ใหคลกปม ดานซายทเปนสวนของ DATA ในหนาจอเมนหลก
19. โปรแกรมจะแสดงหนาจอจดการเพมขอมล โดยโปรแกรมจะสรางรหสสนคาใหอตโนมต ปอน
ขอมลรายละเอยดสนคา และคลกป ม เพอเลอกไฟลภาพสนคา จากนนคลกป ม
โปรแกรมจะบนทกขอมลลงตาราง product
Python-GUI 39
20. จากนนเพมขอมลอก 2 รายการ (ในทนเปนเพยงตวอยาง สามารถเพมขอมลหรอรปเปนสนคาอนกได) และหลงจากทโปรแกรมบนทกขอมลลงตาราง product แลว ใหคลกป ม เพอออกจากหนาจอน กลบไปหนาจอเมนหลก
21. โปรแกรมจะแสดงหนาจอเมนหลก ในกรณทตองการดขอมลใหคลกป ม ดานขวา ทเปนสวนของ QUERY
22. โปรแกรมจะแสดงขอมลผใชทงหมดทมสถานะ active ในกรณทตองการออกจากหนาจอน ให
คลกป ม
Python-GUI 40
23. โปรแกรมจะแสดงหนาจอเมนหลก ในกรณทตองการ update ขอมล ใหคลกเมน update คลกเลอก product
24. โปรแกรมจะแสดงหนาจอจดการแกไขขอมล ใหคลกรายการทตองการแกไข ขอมลจะถกแสดงบนชอง widget โดยขอมลทแกไขไดคอ ชอสนคา จ านวนสนคา ราคาตนทนสนคา และชอไฟล
ภาพสนคา เมอแกไขขอมลแลวใหคลกป ม และ โปรแกรมจะบนทกขอมลลงตาราง product
25. โปรแกรมจะแสดงขอมลทถกแกไขแลว ใหคลกป ม เพอออกจากหนาจอน กลบไปหนาจอเมนหลก
Python-GUI 41
26. โปรแกรมจะแสดงหนาจอเมนหลก ในกรณทตองการดขอมลใหคลกป ม ดานขวา ทเปนสวนของ QUERY
27. โปรแกรมจะแสดงขอมลทงหมด ใหคลกปม เพอออกจากหนาจอน กลบไปหนาจอเมนหลก
28. ในกรณทตองการจดการขอมล stockin ใหคลกปม ดานซายทเปนสวนของ DATA ในหนาจอเมนหลก
29. โปรแกรมจะแสดงหนาจอจดการเพมขอมล คลกเลอกรายการสนคาทตองการรบเขาจากProduct List ดานขวา ขอมลจะถกแสดงในต าแหนงของ widget ตางๆ ใหปอนขอมล
รายละเอยดสนคาทรบเขา แลวคลกป ม และป ม โปรแกรมจะบนทก
Python-GUI 42
ขอมลลงตาราง stockin โดยตนทนสนคาทรบเขา 145 บาท นน โปรแกรมจะค านวณตนทนสนคาเฉลยจากเดม 135 บาท ไดตนทนสนคาเฉลยเปน 140 บาท
30. จากนนเพมขอมลอก 2 รายการ (ในทนเปนเพยงตวอยาง สามารถเพมขอมลหรอรปเปนสนคา
อนกได) และหลงจากทโปรแกรมบนทกขอมลลงตาราง stockin แลว ใหคลกป ม เพอออกจากหนาจอน กลบไปหนาจอเมนหลก
31. โปรแกรมจะแสดงหนาจอเมนหลก ในกรณทตองการดขอมลใหคลกป ม ดานขวา ทเปนสวนของ QUERY
Python-GUI 43
32. โปรแกรมจะแสดงขอมลทรบเขา โดยมการจดกลมรวมจ านวนสนคาทมรหสเดยวกน และแสดงตนทนสนคาเปนตนทนสนคาเฉลย ในกรณทตองการออกจากหนาจอน ใหคลกป ม
33. โปรแกรมจะแสดงหนาจอเมนหลก ในกรณทตองการออกจากระบบ ใหคลกป ม
สรปทายบท
ในบทนไดเรยนรการใชเครองมอ Qt Designer สราง GUI Form แบบลากวาง widget ตางๆ เพอจดการสรางแตละหนาจอ ซงสามารถท าไดงายและสะดวกรวดเรว เปนการลดขนตอนของการเขยนชดค าสงในสวนของการสรางหนาจอ โดยผเขยนไดอธบายถงขนตอนการตดตงโมดล PyQt และ Qt Designer การแปลง GUI Form เปนไฟลภาษา Python และการเขยนค าสงผานโมดล PyQt5 เพอให GUI Form ของแตละหนาจอสามารถท างานได
นอกจากนยงไดเรยนรข นตอนการเขยนค าสงตรวจจบเหตการณเพอควบคมการท างานของ widget ตางๆ ผานตวอยางประยกต ซงสามารถศกษา และน าไปประยกตใชกบงานจรงได