ต่อจาก
บทที่ ๑๘
ในบทนี้จะพูดถึง QFileDialog ซึ่งเป็นหน้าต่างสำหรับเปิดค้นไฟล์ซึ่งอาจใช้ตอนที่ต้องการเปิดไฟล์
หรือตอนที่จะทำการบันทึกไฟล์ เป็นต้น
การสร้างหน้าต่างค้นไฟล์เพื่อนำมาเปิด {QFileDialog.getOpenFileName}
QFileDialog.getOpenFileName ใช้สำหรับเมื่อต้องการค้นเอาไฟล์ใดไฟล์หนึ่งจากในเครื่องมาเปิด โดยเมื่อใช้ แล้วจะได้ค่าคืนกลับมาเป็นชื่อไฟล์ที่เลือก ซึ่งก็สามารถเอามาเปิดอ่านได้
ค่าคืนกลับมาได้จาก QFileDialog.getOpenFileName จะมี ๒ ตัว ตัวแรกคือชื่อไฟล์ที่เลือก ส่วนอีกตัวถ้ากด cancel จะได้ออกมาเป็นสายอักขระเปล่า
''
ถ้าหากกด ok จะได้เป็นค่า filter ซึ่งถ้าหากไม่ได้ตั้ง filter ไว้จะได้เป็น
'All Files (*)'
สำหรับเรื่อง filter จะเขียนถึงภายหลัง
ตัวอย่างเช่น ลองให้เริ่มมาถึงก็ขึ้นหน้าต่างเลือกไฟล์มาแล้วก็อ่านเนื้อหาในไฟล์ เอามานับจำนวนตัวอักษรและบรรทัด
import sys
from PyQt5.QtWidgets import QApplication,QWidget,QFileDialog,QLabel
qAp = QApplication(sys.argv)
natang = QWidget()
natang.setStyleSheet('font-family: Tahoma; font-size: 17px')
chuefile,ok = QFileDialog.getOpenFileName(natang)
# ได้ชื่อไฟล์มา นำมาเปิดด้วย open ได้
with open(chuefile,encoding='utf-8') as f:
nueaha = f.read() # อ่านเนื้อหาในไฟล์
if(ok and nueaha!=''): # ถ้าไม่ได้กด cancel และเนื้อหาในไฟล์ไม่ว่างเปล่า
khokhwam = QLabel('%d ตัวอักษร\n%d บรรทัด'%(len(nueaha),len(nueaha.split('\n'))),natang)
else:
khokhwam = QLabel('ไม่มีข้อความ',natang)
khokhwam.setGeometry(10,10,150,70)
natang.show()
qAp.exec_()
การสร้างหน้าต่างค้นไฟล์หลายไฟล์ {QFileDialog.getOpenFileNames}
สำหรับ QFileDialog.getOpenFileNames นั้นจะคล้ายกับ QFileDialog.getOpenFileName ต่างกันแค่เติม s เข้ามา ซึ่งหมายความว่าสามารถเลือกได้พร้อมกันทีละหลายไฟล์ ค่าคืนกลับที่ได้มานั้นจะเป็นลิสต์ของชื่อไฟล์ทั้งหมดที่ถูกเลือก
ตัวอย่าง ลองสร้างช่องเลือกไฟล์แล้วให้เอาชื่อไฟล์ทั้งหมดที่เลือกมาแสดง
import sys
from PyQt5.QtWidgets import QApplication,QWidget,QFileDialog,QLabel,QScrollArea
qAp = QApplication(sys.argv)
natang = QWidget()
lis_file,ok = QFileDialog.getOpenFileNames(natang)
print(lis_file)
if(ok): # ถ้ากด ok จึงให้อ่านไฟล์
ss = ''
for i,s in enumerate(lis_file,1): # ไล่ใส่ชื่อทีละไฟล์
ss += '%d. ~ '%i+s+'\n'
ss = ss.strip()
khokhwam = QLabel(ss,natang)
thiluean = QScrollArea(natang)
thiluean.setWidget(khokhwam)
thiluean.setGeometry(300,250)
natang.show()
qAp.exec_()
จะได้หน้าต่างที่สามารถกดเลือกได้ทีละหลายไฟล์แบบนี้
การกรองให้เลือกได้เฉพาะไฟล์ที่ต้องการ {filter}
เมื่อใช้ QFileDialog.getOpenFileNames หรือ QFileDialog.getOpenFileName หากต้องการกรองให้สามารถเลือกได้แค่เฉพาะไฟล์บางสกุลก็ทำได้โดยใส่คีย์เวิร์ด filter โดยใส่เป็น
filter='*.สกุล'
แบบนี้
ค่า filter ที่ใส่ลงไปนี้จะได้มาเป็นค่าคืนกลับตัวที่ ๒ ในกรณีที่กด ok ด้วย
ตัวอย่างเช่น ลองทำคล้ายกับตัวอย่างที่แล้ว คือเลือกหลายไฟล์แล้วเอามาแสดงชื่อไฟล์ที่เลือก แต่ตั้งให้เลือกได้แค่ไฟล์ html ดู
import sys
from PyQt5.QtWidgets import QApplication,QWidget,QFileDialog,QLabel,QVBoxLayout
qAp = QApplication(sys.argv)
natang = QWidget()
natang.setStyleSheet('font-family: Tahoma; font-size: 18px')
vbl = QVBoxLayout()
natang.setLayout(vbl)
lis_file,ok = QFileDialog.getOpenFileNames(natang,filter='*.html')
print(ok) # ถ้ากด ok จะได้ *.html ถ้ากด cancel จะว่างเปล่า ''
if(ok):
for chuefile in lis_file:
vbl.addWidget(QLabel(chuefile))
else:
vbl.addWidget(QLabel('ไม่มีไฟล์'))
natang.show()
qAp.exec_()
จะได้หน้าต่างที่กดเลือกได้แค่ไฟล์ .html แบบนี้
การสร้างหน้าต่างค้นโฟลเดอร์ {QFileDialog.getExistingDirectory}
หากต้องการแค่เลือกโฟลเดอร์ให้ใช้ QFileDialog.getExistingDirectory
ค่าคืนกลับที่ได้จาก QFileDialog.getExistingDirectory นี้จะมีเพียงตัวเดียว คือชื่อโฟลเดอร์ ซึ่งถ้าหากกด cancel ก็จะได้
''
ตัวอย่างเช่น ลองให้ขึ้นหน้าต่างเลือกโฟลเดอร์แล้วเปิดดูชื่อไฟล์ในโฟล์เดอร์นั้นทั้งหมดโดยใช้ os.listdir
import sys,os
from PyQt5.QtWidgets import QApplication,QWidget,QFileDialog,QLabel,QScrollArea
qAp = QApplication(sys.argv)
natang = QWidget()
chuefolder = QFileDialog.getExistingDirectory(natang) # เอาชื่อโฟลเดอร์
print(chuefolder)
lis_file = os.listdir(chuefolder) # ค้นดูชื่อไฟล์ในโฟลเดอร์นั้น
print(lis_file) # แสดงชื่อไฟล์ทั้งหมดในนั้น
khokhwam = QLabel(chuefolder+'\n'+'\n'.join(lis_file),natang)
thiluean = QScrollArea(natang)
thiluean.setWidget(khokhwam)
thiluean.setGeometry(10,10,200,200)
natang.show()
qAp.exec_()
ก็จะขึ้นมาให้เลือกได้แค่โฟลเดอร์
การสร้างหน้าต่างตั้งชื่อบันทึกไฟล์ {QFileDialog.getSaveFileName}
QFileDialog.getSaveFileName เอาไว้ใช้เวลาตั้งชื่อไฟล์เมื่อจะบันทึกข้อมูลลงไฟล์
ค่าคืนกลับที่ได้จะเหมือนกับกรณีที่ใช้ QFileDialog.getOpenFileName คือจะเป็นชื่อไฟล์กับค่า filter
ค่า filter ในที่นี้ก็คือตัวกรองที่เราตั้งไว้โดยใส่ในคีย์เวิร์ด filter ซึ่งในที่นี้หากตั้งไว้ก็จะเป็นการกำหนดสกุลของไฟล์ที่จะบันทึกนั้นไปโดยอัตโนมัติ
ตัวอย่างเช่นสร้างกรอบข้อความแล้วให้พอกดปุ่ม "บันทึก" ก็จะบันทึกข้อความลงในไฟล์ โดยให้เลือกชื่อไฟล์ขึ้นมา เมื่อตั้งชื่อแล้วไฟล์ก็จะขึ้นสกุล .txt ให้โดยอัตโนมัติ
import sys
from PyQt5.QtWidgets import QApplication,QWidget,QFileDialog,QLineEdit,QPushButton,QVBoxLayout
qAp = QApplication(sys.argv)
natang = QWidget()
natang.setStyleSheet('font-family: Tahoma; font-size: 18px')
# ฟังก์ชันนี้ให้ทำงานเมื่อกดปุ่มบันทึก จะบันทึกข้อความที่ใส่ลงในไฟล์ชื่อที่เลือก
def banthuek():
chuefile,ok = QFileDialog.getSaveFileName(natang,filter='*.txt')
if(ok):
print(chuefile)
with open(chuefile,'w',encoding='utf-8') as f:
f.write(khokhwam.text())
vbl = QVBoxLayout()
natang.setLayout(vbl)
khokhwam = QLineEdit()
vbl.addWidget(khokhwam)
pum = QPushButton('บันทึก')
pum.clicked.connect(banthuek)
vbl.addWidget(pum)
natang.show()
qAp.exec_()
ก็จะได้หน้าต่างให้กรอกข้อความแบบนี้ ลองกรอกแล้วกดบันทึกดูได้ จะได้ไฟล์ .txt มา
อ่านบทถัดไป >>
บทที่ ๒๐