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



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

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

ในบทนี้จะพูดถึง 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
การเรียนรู้ของเครื่อง
-- โครงข่าย
     ประสาทเทียม
maya
javascript
ความน่าจะเป็น
บันทึกในญี่ปุ่น
บันทึกในจีน
-- บันทึกในปักกิ่ง
-- บันทึกในฮ่องกง
-- บันทึกในมาเก๊า
บันทึกในไต้หวัน
บันทึกในยุโรปเหนือ
บันทึกในประเทศอื่นๆ
เรียนภาษาจีน
qiita
บทความอื่นๆ

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



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

  ค้นหาบทความ

  บทความแนะนำ

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

ไทย

日本語

中文