Python中如何用PyQt5创建GUI界面,实现.py文件列表显示并调用执行

刚入门 python 和 Pyqt5,想请教大神。
我想用 pyqt5 开发一个 GUI 程序,界面中能列表形式显示某文件夹下的所有 py 文件和子文件夹,且可以打开子文件夹或选定执行某个 py 文件。
想问一下这个功能大概如何实现?
第一个问题在界面中显示文件夹中的 py 文件,用 QListWidget 控件,不知道是否合适,有什么需要注意的关键点
第二个问题,在显示的文件列表中,选定某个 py 文件执行,这个该怎么实现?
Python中如何用PyQt5创建GUI界面,实现.py文件列表显示并调用执行

3 回复

如果你刚入门 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()

代码说明:

  1. 界面组件

    • QListWidget:显示.py文件列表
    • QPushButton:目录选择、刷新、执行按钮
    • QLabel:显示当前目录和执行输出
    • QStatusBar:显示状态信息
  2. 核心功能

    • select_directory():使用QFileDialog选择目录
    • refresh_file_list():扫描目录并过滤.py文件
    • run_selected_file():使用subprocess执行选中的Python文件
  3. 执行机制

    • 使用sys.executable确保使用当前Python解释器
    • capture_output=True捕获标准输出和错误输出
    • 在文件所在目录执行(cwd参数)

使用方法

  1. 安装PyQt5:pip install PyQt5
  2. 保存上面的代码为file_runner.py
  3. 运行程序:python file_runner.py
  4. 点击"选择目录"按钮选择包含.py文件的目录
  5. 从列表中选择文件,点击"执行选中文件"

特点

  • 实时显示执行输出
  • 支持错误捕获和显示
  • 显示执行状态和返回码
  • 双击列表项可快速执行

这个程序可以直接运行,你可以根据需要添加更多功能,比如多文件选择、参数传递、历史记录等。

非常感谢你的建议和对我问题的解答,python 语言这块已经学过一些,也开发了一些功能模块,算是刚入门。尝试一下你给我的解决方案,希望以后能多得到高人们的指点

回到顶部