Python+PyQt手搓一個文件瀏覽器
一、效果展示
二、界面設(shè)計
該界面通過Qt Designer設(shè)計
# -*- coding: utf-8 -*- # Form implementation generated from reading ui file 'file_web.ui' # # Created by: PyQt5 UI code generator 5.15.9 # # WARNING: Any manual changes made to this file will be lost when pyuic5 is # run again. Do not edit this file unless you know what you are doing. from PyQt5 import QtCore, QtGui, QtWidgets class Ui_Form(object): def setupUi(self, Form): Form.setObjectName("Form") Form.resize(565, 459) self.verticalLayoutWidget = QtWidgets.QWidget(Form) self.verticalLayoutWidget.setGeometry(QtCore.QRect(10, 10, 551, 441)) self.verticalLayoutWidget.setObjectName("verticalLayoutWidget") self.verticalLayout = QtWidgets.QVBoxLayout(self.verticalLayoutWidget) self.verticalLayout.setContentsMargins(0, 0, 0, 0) self.verticalLayout.setObjectName("verticalLayout") self.horizontalLayout = QtWidgets.QHBoxLayout() self.horizontalLayout.setObjectName("horizontalLayout") self.back_btn = QtWidgets.QPushButton(self.verticalLayoutWidget) self.back_btn.setMinimumSize(QtCore.QSize(40, 40)) font = QtGui.QFont() font.setPointSize(15) self.back_btn.setFont(font) self.back_btn.setObjectName("back_btn") self.horizontalLayout.addWidget(self.back_btn) self.lineEdit = QtWidgets.QLineEdit(self.verticalLayoutWidget) font = QtGui.QFont() font.setPointSize(15) self.lineEdit.setFont(font) self.lineEdit.setObjectName("lineEdit") self.horizontalLayout.addWidget(self.lineEdit) self.verticalLayout.addLayout(self.horizontalLayout) self.listWidget = QtWidgets.QListWidget(self.verticalLayoutWidget) self.listWidget.setObjectName("listWidget") self.verticalLayout.addWidget(self.listWidget) self.retranslateUi(Form) QtCore.QMetaObject.connectSlotsByName(Form) def retranslateUi(self, Form): _translate = QtCore.QCoreApplication.translate Form.setWindowTitle(_translate("Form", "文件瀏覽器")) self.back_btn.setText(_translate("Form", "返回"))
三、 信號與槽連接
3.1、得到當(dāng)前的目錄路徑
def show_dir(self): # 顯示當(dāng)前目錄內(nèi)容的函數(shù) self.listWidget.clear() # 清空列表 self.dir.setPath(self.lineEdit.text()) # 設(shè)置QDir對象的路徑為文本框中的路徑 Dir_filter = QDir.AllEntries | QDir.NoDotAndDotDot # 過濾條件:所有條目,不包括.和.. sort_filter = QDir.DirsFirst # 排序條件:文件夾優(yōu)先 self.list_list = self.dir.entryInfoList(Dir_filter, sort_filter) # 獲取目錄列表 for i in self.list_list: # 遍歷目錄列表 item = QListWidgetItem() # 創(chuàng)建新的列表項 # 根據(jù)條目類型設(shè)置圖標(biāo) if i.isDir(): item.setIcon(QIcon('../菜單/images/icon/dir.png')) # 設(shè)置目錄圖標(biāo) elif i.isFile(): item.setIcon(QIcon('../菜單/images/icon/file.png')) # 設(shè)置文件圖標(biāo) item.setText(i.fileName()) # 設(shè)置列表項的文本為文件或目錄名 self.listWidget.addItem(item) # 將項添加到列表中
3.2、 選擇目錄中的選項雙擊
def btn_btn(self, item): # 雙擊列表項的槽函數(shù) result = self.dir.cd(item.text()) # 進入選中的目錄 print(result) # 打印進入結(jié)果 if result: # 如果成功進入目錄 path = self.dir.absolutePath() # 獲取當(dāng)前目錄的絕對路徑 self.lineEdit.setText(path) # 更新路徑文本框 self.show_dir() # 更新目錄展示 else: # 如果不是目錄,嘗試打開文件 filepath = self.dir.absolutePath() + '/' + item.text() # 構(gòu)造文件路徑 # print(filepath) self.progess = QProcess(self) # 創(chuàng)建QProcess對象用于啟動子進程 argv = [] # 存儲進程的參數(shù) argv.append("notepad.py") # 添加要執(zhí)行的腳本 argv.append(filepath) # 添加文件路徑作為參數(shù) self.progess.start('python', argv) # 啟動python進程
3.3、 返回上層目錄
def back_slot(self): # 返回上層目錄的槽函數(shù) result = self.dir.cdUp() # 嘗試進入上層目錄 if result: # 如果成功 path = self.dir.absolutePath() # 獲取當(dāng)前目錄的絕對路徑 print(path) # 打印路徑 self.lineEdit.setText(path) # 更新文本框中的路徑 self.show_dir() # 更新目錄展示
四、用到的庫函數(shù)
1.QDir
- setPath() 設(shè)置路徑
- entryInfoList() 獲取當(dāng)前目錄下所有文件夾以及文件信息,返回一個列表
- cd() 切換目錄
- cdUp() 返回上一級目錄
- absolutePath() 獲取當(dāng)前目錄的絕對路徑
2.QListWidget
- addItem() 添加單元項
- clear() 清空列表
- itemDoubleClicked() 單元項雙擊信號
3.QListWidgetItem
- setText() 設(shè)置文本
- setIcon() 設(shè)置圖標(biāo)
- text() 獲取文本內(nèi)容
4.QFileInfoList
at() 訪問元素
5.QFileInfo
- fileName() 獲取文件名
- isDir() 判斷是不是文件夾
- isFile() 判斷是不是文件
6.QProcess
start() 啟動進程
五、完整代碼
import sys from PyQt5.QtGui import QIcon from file_web import Ui_Form # 導(dǎo)入生成的UI類 from PyQt5.QtWidgets import QApplication, QWidget, QListWidget, QListWidgetItem # 導(dǎo)入所需的Qt組件 from PyQt5.QtCore import QDir, QProcess # 導(dǎo)入目錄和進程相關(guān)的類 class fileWidge(QWidget, Ui_Form): def __init__(self): super().__init__() self.setupUi(self) # 設(shè)置UI界面 self.lineEdit.setText('./') # 設(shè)置初始路徑為當(dāng)前目錄 self.dir = QDir() # 創(chuàng)建QDir對象以處理目錄 self.show_dir() # 顯示當(dāng)前目錄的內(nèi)容 self.slot_init() # 初始化信號和槽連接 def slot_init(self): # 連接按鈕和列表項的信號到相應(yīng)的槽函數(shù) self.back_btn.clicked.connect(self.back_slot) # 返回上級目錄按鈕 self.listWidget.itemDoubleClicked.connect(self.btn_btn) # 雙擊列表項打開 def back_slot(self): # 返回上層目錄的槽函數(shù) result = self.dir.cdUp() # 嘗試進入上層目錄 if result: # 如果成功 path = self.dir.absolutePath() # 獲取當(dāng)前目錄的絕對路徑 print(path) # 打印路徑 self.lineEdit.setText(path) # 更新文本框中的路徑 self.show_dir() # 更新目錄展示 def btn_btn(self, item): # 雙擊列表項的槽函數(shù) result = self.dir.cd(item.text()) # 進入選中的目錄 print(result) # 打印進入結(jié)果 if result: # 如果成功進入目錄 path = self.dir.absolutePath() # 獲取當(dāng)前目錄的絕對路徑 self.lineEdit.setText(path) # 更新路徑文本框 self.show_dir() # 更新目錄展示 else: # 如果不是目錄,嘗試打開文件 filepath = self.dir.absolutePath() + '/' + item.text() # 構(gòu)造文件路徑 # print(filepath) self.progess = QProcess(self) # 創(chuàng)建QProcess對象用于啟動子進程 argv = [] # 存儲進程的參數(shù) argv.append("notepad.py") # 添加要執(zhí)行的腳本 argv.append(filepath) # 添加文件路徑作為參數(shù) self.progess.start('python', argv) # 啟動python進程 def show_dir(self): # 顯示當(dāng)前目錄內(nèi)容的函數(shù) self.listWidget.clear() # 清空列表 self.dir.setPath(self.lineEdit.text()) # 設(shè)置QDir對象的路徑為文本框中的路徑 Dir_filter = QDir.AllEntries | QDir.NoDotAndDotDot # 過濾條件:所有條目,不包括.和.. sort_filter = QDir.DirsFirst # 排序條件:文件夾優(yōu)先 self.list_list = self.dir.entryInfoList(Dir_filter, sort_filter) # 獲取目錄列表 for i in self.list_list: # 遍歷目錄列表 item = QListWidgetItem() # 創(chuàng)建新的列表項 # 根據(jù)條目類型設(shè)置圖標(biāo) if i.isDir(): item.setIcon(QIcon('../菜單/images/icon/dir.png')) # 設(shè)置目錄圖標(biāo) elif i.isFile(): item.setIcon(QIcon('../菜單/images/icon/file.png')) # 設(shè)置文件圖標(biāo) item.setText(i.fileName()) # 設(shè)置列表項的文本為文件或目錄名 self.listWidget.addItem(item) # 將項添加到列表中 if __name__ == '__main__': app = QApplication(sys.argv) # 創(chuàng)建應(yīng)用程序?qū)嵗? windows = fileWidge() # 創(chuàng)建主窗口實例 windows.show() # 顯示主窗口 sys.exit(app.exec_()) # 運行應(yīng)用程序并在退出時關(guān)閉
到此這篇關(guān)于Python+PyQt手搓一個文件瀏覽器的文章就介紹到這了,更多相關(guān)Python文件瀏覽器內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python報錯TypeError: tuple indices must be
在Python編程過程中,我們經(jīng)常會遇到各種各樣的報錯信息,其中,“TypeError: tuple indices must be integers or slices, not str”這個報錯,對于很多開發(fā)者來說,可能既熟悉又陌生,今天,我們就來深入探討一下這個報錯,看看它是如何產(chǎn)生的,以及如何快速有效地解決它2025-01-01python GUI庫圖形界面開發(fā)之PyQt5菜單欄控件QMenuBar的詳細使用方法與實例
這篇文章主要介紹了python GUI庫圖形界面開發(fā)之PyQt5菜單欄控件QMenuBar的詳細使用方法與實例,需要的朋友可以參考下2020-02-02pytorch dataloader 取batch_size時候出現(xiàn)bug的解決方式
今天小編就為大家分享一篇pytorch dataloader 取batch_size時候出現(xiàn)bug的解決方式,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-02-02關(guān)于python函數(shù)的建立、調(diào)用、傳參、返回值詳解
這篇文章主要介紹了關(guān)于python函數(shù)的建立、調(diào)用、傳參、返回值詳解,Python?還支持自定義函數(shù),即將一段有規(guī)律的、可重復(fù)使用的代碼定義成函數(shù),從而達到一次編寫多次調(diào)用的目的,需要的朋友可以參考下2023-07-07