You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PyQt实现QListWidget加载文件夹图片并获取选中文件相对路径

解决PyQt5加载文件夹图片并获取选中路径的问题

核心问题修复与功能实现

你的代码存在两个关键问题:一是创建了加载文件名的list1但未添加到布局,导致图片列表无法显示;二是缺少选中项的信号处理逻辑,无法获取选中图片的路径。以下是修改后的完整代码,同时实现你需要的两个功能:

from PyQt5.QtCore import Qt
from PyQt5.QtWidgets import *
import os

app = QApplication([])

main_win = QWidget()
main_win.resize(1000, 500)
main_win.setWindowTitle('Scuffed Photoshop')

# 存储选中图片的相对路径
selected_image_path = ""

save_button = QPushButton("SAVE")
blur_button = QPushButton("Blur")
sharpen_button = QPushButton("sharpen")
bw_button = QPushButton("Black & White")

# 加载"unedited"文件夹中的图片
image_folder = "unedited"
# 自动创建文件夹避免报错
if not os.path.exists(image_folder):
    os.makedirs(image_folder)

image_list = QListWidget()
# 筛选常见图片格式,避免加载非图片文件
valid_extensions = ('.png', '.jpg', '.jpeg', '.bmp', '.gif')
for filename in os.listdir(image_folder):
    if filename.lower().endswith(valid_extensions):
        image_list.addItem(filename)

# 处理选中事件,更新路径变量
def update_selected_path(item):
    global selected_image_path
    if item:
        selected_image_path = os.path.join(image_folder, item.text())
        # 打印路径用于测试,实际使用可删除
        print(f"当前选中图片路径: {selected_image_path}")

image_list.itemClicked.connect(update_selected_path)

# 布局调整(修复原布局中未加载图片列表的问题)
line1 = QVBoxLayout()
line2 = QVBoxLayout()
line3 = QHBoxLayout()

line2_line1 = QHBoxLayout()
line2_line2 = QHBoxLayout()

# 将图片列表添加到布局中
line3.addWidget(image_list, alignment=Qt.AlignLeft)

line2_line2.addWidget(save_button, alignment=Qt.AlignBottom)
line2_line2.addWidget(blur_button, alignment=Qt.AlignBottom)
line2_line2.addWidget(sharpen_button, alignment=Qt.AlignBottom)
line2_line2.addWidget(bw_button, alignment=Qt.AlignBottom)

linesV = [line1, line2]
line3.addLayout(line2)

for layout in linesV:
    line3.addLayout(layout)

line2.addLayout(line2_line1)
line2.addLayout(line2_line2)

main_win.setLayout(line3)

main_win.show()
app.exec_()

关键修改说明

  • 修复布局显示:将原本未使用的图片列表控件替换为image_list并添加到主布局,确保图片文件名能正常显示
  • 图片格式筛选:添加后缀过滤逻辑,只加载常见图片格式文件
  • 路径存储逻辑:定义全局变量selected_image_path,通过itemClicked信号绑定处理函数,点击列表项时自动拼接并更新相对路径
  • 容错处理:自动创建不存在的unedited文件夹,避免程序启动报错

进阶优化建议

如果后续功能扩展,建议改用类结构实现,避免全局变量,代码更易维护:

from PyQt5.QtCore import Qt
from PyQt5.QtWidgets import *
import os

class MiniPhotoshop(QWidget):
    def __init__(self):
        super().__init__()
        self.selected_image_path = ""
        self.setup_ui()

    def setup_ui(self):
        self.resize(1000, 500)
        self.setWindowTitle('Scuffed Photoshop')

        # 按钮创建
        save_btn = QPushButton("SAVE")
        blur_btn = QPushButton("Blur")
        sharpen_btn = QPushButton("sharpen")
        bw_btn = QPushButton("Black & White")

        # 图片列表加载
        image_folder = "unedited"
        if not os.path.exists(image_folder):
            os.makedirs(image_folder)
        
        self.image_list = QListWidget()
        valid_ext = ('.png', '.jpg', '.jpeg', '.bmp', '.gif')
        for fname in os.listdir(image_folder):
            if fname.lower().endswith(valid_ext):
                self.image_list.addItem(fname)
        
        self.image_list.itemClicked.connect(self.on_item_selected)

        # 布局搭建
        main_layout = QHBoxLayout()
        btn_layout = QVBoxLayout()
        btn_row = QHBoxLayout()

        main_layout.addWidget(self.image_list, alignment=Qt.AlignLeft)
        
        btn_row.addWidget(save_btn, alignment=Qt.AlignBottom)
        btn_row.addWidget(blur_btn, alignment=Qt.AlignBottom)
        btn_row.addWidget(sharpen_btn, alignment=Qt.AlignBottom)
        btn_row.addWidget(bw_btn, alignment=Qt.AlignBottom)
        
        btn_layout.addLayout(QHBoxLayout())  # 空布局占位
        btn_layout.addLayout(btn_row)
        main_layout.addLayout(btn_layout)
        main_layout.addLayout(QVBoxLayout())  # 空布局占位

        self.setLayout(main_layout)

    def on_item_selected(self, item):
        if item:
            self.selected_image_path = os.path.join("unedited", item.text())
            print(f"选中图片路径: {self.selected_image_path}")

if __name__ == "__main__":
    app = QApplication([])
    window = MiniPhotoshop()
    window.show()
    app.exec_()

内容的提问来源于stack exchange,提问作者RaptoRR

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 05:30:43