Python中如何用PyQt5创建GUI界面,实现.py文件列表显示并调用执行
刚入门 python 和 Pyqt5,想请教大神。
我想用 pyqt5 开发一个 GUI 程序,界面中能列表形式显示某文件夹下的所有 py 文件和子文件夹,且可以打开子文件夹或选定执行某个 py 文件。
想问一下这个功能大概如何实现?
第一个问题在界面中显示文件夹中的 py 文件,用 QListWidget 控件,不知道是否合适,有什么需要注意的关键点
第二个问题,在显示的文件列表中,选定某个 py 文件执行,这个该怎么实现?
Python中如何用PyQt5创建GUI界面,实现.py文件列表显示并调用执行
如果你刚入门 Python 就做 Qt 开发的话是有困难的。
你应该先把 Python 语言基础这块提高到中级水平,特别是面向对象这块要加强学一下,然后再把各种标准库都过一遍。
不然上来你学 Qt 坑太多比较耽误时间。
说心理话你这个问题问得有点太大了,我只能简单说两句。
第一个问题在界面中显示文件夹中的 py 文件,用 QListWidget 控件,不知道是否合适,有什么需要注意的关键点
如果要树型结构显示可以左边用一个 QTreeWidget 右边用 QListWidget,点 QTreeWidget 节点信号触发 QListWidget 调用 os.listdir(path)显示目录中文件列表。
第二个问题,在显示的文件列表中,选定某个 py 文件执行,这个该怎么实现?
retcode = subprocess.call([“python”, full_path_file_name])
如果要回显结果
subproc = subprocess.Popen([“python”, full_path_file_name], stdout=subprocess.PIPE)
subproc.stdout.read()
我来给你一个完整的PyQt5示例,实现.py文件列表显示和调用执行。
import sys
import os
import subprocess
from PyQt5.QtWidgets import (QApplication, QMainWindow, QWidget, QVBoxLayout,
QHBoxLayout, QListWidget, QPushButton, QLabel,
QFileDialog, QMessageBox)
from PyQt5.QtCore import Qt
class PythonFileRunner(QMainWindow):
def __init__(self):
super().__init__()
self.initUI()
self.current_directory = os.getcwd()
def initUI(self):
# 设置窗口
self.setWindowTitle('Python文件执行器')
self.setGeometry(300, 300, 600, 400)
# 创建中央部件
central_widget = QWidget()
self.setCentralWidget(central_widget)
# 主布局
main_layout = QVBoxLayout()
central_widget.setLayout(main_layout)
# 顶部标签
self.dir_label = QLabel(f"当前目录: {self.current_directory}")
main_layout.addWidget(self.dir_label)
# 按钮布局
button_layout = QHBoxLayout()
# 选择目录按钮
self.select_dir_btn = QPushButton("选择目录")
self.select_dir_btn.clicked.connect(self.select_directory)
button_layout.addWidget(self.select_dir_btn)
# 刷新按钮
self.refresh_btn = QPushButton("刷新")
self.refresh_btn.clicked.connect(self.refresh_file_list)
button_layout.addWidget(self.refresh_btn)
# 执行按钮
self.run_btn = QPushButton("执行选中文件")
self.run_btn.clicked.connect(self.run_selected_file)
self.run_btn.setEnabled(False)
button_layout.addWidget(self.run_btn)
main_layout.addLayout(button_layout)
# 文件列表
self.file_list = QListWidget()
self.file_list.itemSelectionChanged.connect(self.on_selection_changed)
main_layout.addWidget(self.file_list)
# 输出标签
self.output_label = QLabel("输出:")
main_layout.addWidget(self.output_label)
# 状态栏
self.statusBar().showMessage("就绪")
# 初始加载文件列表
self.refresh_file_list()
def select_directory(self):
"""选择目录"""
directory = QFileDialog.getExistingDirectory(self, "选择目录", self.current_directory)
if directory:
self.current_directory = directory
self.dir_label.setText(f"当前目录: {self.current_directory}")
self.refresh_file_list()
def refresh_file_list(self):
"""刷新文件列表"""
self.file_list.clear()
try:
# 获取当前目录下所有.py文件
files = [f for f in os.listdir(self.current_directory)
if f.endswith('.py') and os.path.isfile(os.path.join(self.current_directory, f))]
if files:
for file in sorted(files):
self.file_list.addItem(file)
self.statusBar().showMessage(f"找到 {len(files)} 个Python文件")
else:
self.statusBar().showMessage("当前目录没有Python文件")
except Exception as e:
QMessageBox.warning(self, "错误", f"无法读取目录: {str(e)}")
def on_selection_changed(self):
"""选中项改变时启用/禁用执行按钮"""
self.run_btn.setEnabled(len(self.file_list.selectedItems()) > 0)
def run_selected_file(self):
"""执行选中的Python文件"""
selected_items = self.file_list.selectedItems()
if not selected_items:
return
file_name = selected_items[0].text()
file_path = os.path.join(self.current_directory, file_name)
try:
self.statusBar().showMessage(f"正在执行: {file_name}...")
# 使用subprocess执行Python文件
result = subprocess.run(
[sys.executable, file_path],
capture_output=True,
text=True,
cwd=self.current_directory
)
# 显示输出结果
output_text = ""
if result.stdout:
output_text += f"标准输出:\n{result.stdout}\n"
if result.stderr:
output_text += f"错误输出:\n{result.stderr}\n"
if result.returncode == 0:
output_text += f"执行成功 (返回码: {result.returncode})"
else:
output_text += f"执行失败 (返回码: {result.returncode})"
self.output_label.setText(f"输出:\n{output_text}")
self.statusBar().showMessage(f"执行完成: {file_name}")
except Exception as e:
QMessageBox.critical(self, "执行错误", f"执行文件时出错: {str(e)}")
self.statusBar().showMessage("执行失败")
def main():
app = QApplication(sys.argv)
window = PythonFileRunner()
window.show()
sys.exit(app.exec_())
if __name__ == '__main__':
main()
代码说明:
-
界面组件:
QListWidget:显示.py文件列表QPushButton:目录选择、刷新、执行按钮QLabel:显示当前目录和执行输出QStatusBar:显示状态信息
-
核心功能:
select_directory():使用QFileDialog选择目录refresh_file_list():扫描目录并过滤.py文件run_selected_file():使用subprocess执行选中的Python文件
-
执行机制:
- 使用
sys.executable确保使用当前Python解释器 capture_output=True捕获标准输出和错误输出- 在文件所在目录执行(
cwd参数)
- 使用
使用方法:
- 安装PyQt5:
pip install PyQt5 - 保存上面的代码为
file_runner.py - 运行程序:
python file_runner.py - 点击"选择目录"按钮选择包含.py文件的目录
- 从列表中选择文件,点击"执行选中文件"
特点:
- 实时显示执行输出
- 支持错误捕获和显示
- 显示执行状态和返回码
- 双击列表项可快速执行
这个程序可以直接运行,你可以根据需要添加更多功能,比如多文件选择、参数传递、历史记录等。
非常感谢你的建议和对我问题的解答,python 语言这块已经学过一些,也开发了一些功能模块,算是刚入门。尝试一下你给我的解决方案,希望以后能多得到高人们的指点

