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

PyQt5中QFileDialog.getExistingDirectory函数弹窗异常求助

解决QFileDialog.getExistingDirectory重复弹出对话框的问题

问题诊断

你遇到的重复弹出对话框问题,核心原因是信号槽重复绑定:
PyQt自带自动信号槽连接机制,当槽函数命名为on_<控件对象名>_<信号名>(比如你的on_workDirButton_clicked)时,调用setupUi时Qt会自动将按钮的clicked信号绑定到该槽函数。而你又手动执行了self.workDirButton.clicked.connect(self.on_workDirButton_clicked),导致同一个信号被多次绑定,每次点击按钮都会触发多次槽函数调用,每次调用都会弹出一个目录选择对话框。

解决方案

提供两种可行的修复方式:

方式一:移除手动信号连接

保留on_workDirButton_clicked的命名,依靠PyQt的自动连接机制,删掉手动绑定的代码:

import sys
import os
from PyQt5 import QtWidgets
import mdat2cm_QtD # file created using QtDessing and pyuic5 filename.ui -o filename.py

def setCurrentDirectory(self) :
    self.workDirLabel.setText(self.directory)
    return

class MyApp(QtWidgets.QMainWindow, mdat2cm_QtD.Ui_MainWindow):
    def __init__(self):
        super().__init__()
        self.setupUi(self)
        # Add your custom code here
        try: 
            self.previousPath= open(os.path.expanduser('~')+"\\.mdat2cm_last").readlines()
            self.directory=self.previousPath[0]
            setCurrentDirectory(self)
        except:
            self.previousPath=[""]

        # 移除手动连接代码,依赖PyQt自动连接
        # self.workDirButton.clicked.connect(self.on_workDirButton_clicked)

    def on_workDirButton_clicked(self):
        self.directory= QtWidgets.QFileDialog.getExistingDirectory(self,'Select Working Directory',self.previousPath[0])
        try:
            with open(os.path.expanduser('~')+"\\.mdat2cm_last","w") as fff: 
                fff.write(self.directory)
        except:
            pass  # 替换无意义的a=0,更符合Python惯用写法
        return

方式二:修改槽函数名称

修改槽函数名避免触发自动连接,保留手动绑定逻辑:

import sys
import os
from PyQt5 import QtWidgets
import mdat2cm_QtD # file created using QtDessing and pyuic5 filename.ui -o filename.py

def setCurrentDirectory(self) :
    self.workDirLabel.setText(self.directory)
    return

class MyApp(QtWidgets.QMainWindow, mdat2cm_QtD.Ui_MainWindow):
    def __init__(self):
        super().__init__()
        self.setupUi(self)
        # Add your custom code here
        try: 
            self.previousPath= open(os.path.expanduser('~')+"\\.mdat2cm_last").readlines()
            self.directory=self.previousPath[0]
            setCurrentDirectory(self)
        except:
            self.previousPath=[""]

        # 修改槽函数名后手动连接
        self.workDirButton.clicked.connect(self.select_work_directory)

    def select_work_directory(self):
        self.directory= QtWidgets.QFileDialog.getExistingDirectory(self,'Select Working Directory',self.previousPath[0])
        try:
            with open(os.path.expanduser('~')+"\\.mdat2cm_last","w") as fff: 
                fff.write(self.directory)
        except:
            pass
        return

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 01:45:36