φυβλαςのβλογ
บล็อกของ phyblas



pyqt เบื้องต้น บทที่ ๑๙: การสร้างและใช้งานหน้าต่างเปิดหาไฟล์
เขียนเมื่อ 2021/08/21 21:17
แก้ไขล่าสุด 2021/09/28 16:42

ต่อจาก บทที่ ๑๘

ในบทนี้จะพูดถึง 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 มา





อ่านบทถัดไป >> บทที่ ๒๐





-----------------------------------------

囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧

ดูสถิติของหน้านี้

หมวดหมู่

-- คอมพิวเตอร์ >> เขียนโปรแกรม >> python >> pyqt

ไม่อนุญาตให้นำเนื้อหาของบทความไปลงที่อื่นโดยไม่ได้ขออนุญาตโดยเด็ดขาด หากต้องการนำบางส่วนไปลงสามารถทำได้โดยต้องไม่ใช่การก๊อปแปะแต่ให้เปลี่ยนคำพูดเป็นของตัวเอง หรือไม่ก็เขียนในลักษณะการยกข้อความอ้างอิง และไม่ว่ากรณีไหนก็ตาม ต้องให้เครดิตพร้อมใส่ลิงก์ของทุกบทความที่มีการใช้เนื้อหาเสมอ

สารบัญ

รวมคำแปลวลีเด็ดจากญี่ปุ่น
มอดูลต่างๆ
-- numpy
-- matplotlib

-- pandas
-- manim
-- opencv
-- pyqt
-- pytorch
การเรียนรู้ของเครื่อง
-- โครงข่าย
     ประสาทเทียม
ภาษา javascript
ภาษา mongol
ภาษาศาสตร์
maya
ความน่าจะเป็น
บันทึกในญี่ปุ่น
บันทึกในจีน
-- บันทึกในปักกิ่ง
-- บันทึกในฮ่องกง
-- บันทึกในมาเก๊า
บันทึกในไต้หวัน
บันทึกในยุโรปเหนือ
บันทึกในประเทศอื่นๆ
qiita
บทความอื่นๆ

บทความแบ่งตามหมวด



ติดตามอัปเดตของบล็อกได้ที่แฟนเพจ

  ค้นหาบทความ

  บทความแนะนำ

ตัวอักษรกรีกและเปรียบเทียบการใช้งานในภาษากรีกโบราณและกรีกสมัยใหม่
ที่มาของอักษรไทยและความเกี่ยวพันกับอักษรอื่นๆในตระกูลอักษรพราหมี
การสร้างแบบจำลองสามมิติเป็นไฟล์ .obj วิธีการอย่างง่ายที่ไม่ว่าใครก็ลองทำได้ทันที
รวมรายชื่อนักร้องเพลงกวางตุ้ง
ภาษาจีนแบ่งเป็นสำเนียงอะไรบ้าง มีความแตกต่างกันมากแค่ไหน
ทำความเข้าใจระบอบประชาธิปไตยจากประวัติศาสตร์ความเป็นมา
เรียนรู้วิธีการใช้ regular expression (regex)
การใช้ unix shell เบื้องต้น ใน linux และ mac
g ในภาษาญี่ปุ่นออกเสียง "ก" หรือ "ง" กันแน่
ทำความรู้จักกับปัญญาประดิษฐ์และการเรียนรู้ของเครื่อง
ค้นพบระบบดาวเคราะห์ ๘ ดวง เบื้องหลังความสำเร็จคือปัญญาประดิษฐ์ (AI)
หอดูดาวโบราณปักกิ่ง ตอนที่ ๑: แท่นสังเกตการณ์และสวนดอกไม้
พิพิธภัณฑ์สถาปัตยกรรมโบราณปักกิ่ง
เที่ยวเมืองตานตง ล่องเรือในน่านน้ำเกาหลีเหนือ
ตระเวนเที่ยวตามรอยฉากของอนิเมะในญี่ปุ่น
เที่ยวชมหอดูดาวที่ฐานสังเกตการณ์ซิงหลง
ทำไมจึงไม่ควรเขียนวรรณยุกต์เวลาทับศัพท์ภาษาต่างประเทศ

บทความแต่ละเดือน

2024年

1月 2月 3月 4月
5月 6月 7月 8月
9月 10月 11月 12月

2023年

1月 2月 3月 4月
5月 6月 7月 8月
9月 10月 11月 12月

2022年

1月 2月 3月 4月
5月 6月 7月 8月
9月 10月 11月 12月

2021年

1月 2月 3月 4月
5月 6月 7月 8月
9月 10月 11月 12月

2020年

1月 2月 3月 4月
5月 6月 7月 8月
9月 10月 11月 12月

ค้นบทความเก่ากว่านั้น

ไทย

日本語

中文