PyQt5 QFileDialog在Ubuntu中未返回正确的路径

5
我正在使用以下代码打开文件对话框并返回所选文件名(PyQt5,Ubuntu)。
QtWidgets.QFileDialog.getOpenFileNames(self, 'Open files', self.__target, self.__open_f)

但是你将得到这个列表:
['/home/python/Downloads/addresses.csv', '/home/python/Downloads/airtravel.csv']

我正在获取这个列表:
['/run/user/1000/doc/9f194012/addresses.csv', '/run/user/1000/doc/885466d0/airtravel.csv']

以下是我的代码:

import os
import sys
from mods import fixqt
from PyQt5 import QtWidgets
from PyQt5.QtGui import QIcon

from mods.csvdata import DataCSV
from mods.err_report import report_error
from mods.save_xl import save_excel_file
from ui.mainwindow import Ui_mwWCS

# this is the value of self.__target
home = os.path.expanduser("~/Desktop")
icon_path = os.path.join(os.path.join(os.path.dirname(os.path.realpath(__file__)), "ui"), "Icon.ico")
open_filter = "CSV files (*.csv)"
save_filter = "Excel Workbook (*.xlsx)"
input_data = DataCSV([])

class MainWindow(QtWidgets.QMainWindow):  # window = qtw.QMainWindow()
    def __init__(self, title="", mw_home="", op_filter="All files (*.*)", sv_filter="All files (*.*)", parent=None):
        super().__init__(parent)
        self.__title = title 
        self.ui = Ui_mwWCS() 
        self.ui.setupUi(self)  
        self.__target = mw_home
        self.__open_f = op_filter
        self.__save_f = sv_filter
        self.__excel_file = ""
        self.setWindowIcon(QIcon(icon_path))
        self.__input_data = DataCSV([])

    def __show_dialog(self):
        return QtWidgets.QFileDialog.getOpenFileNames(self, 'Open files', self.__target, self.__open_f)

    def __set_csv(self, lst):
        self.__input_data.set_files_list(lst)
        # print(lst)
        self.__input_data.open_csv_files()
        self.__input_data.exception_entries()
        self.__input_data.set_boxes_number()
        self.__input_data.set_plates_number()

    def on_add_clicked(self):
        try:
            list_names, _ = self.__show_dialog()

            self.ui.lstInput.addItems(list_names)
            self.__set_csv(list_names)

        except Exception as e:
            report_error("Error occurred (ADD)", e)

请问如何获取正确的文件名?

更新: 在终端中尝试我的代码可以正常工作,这可能与pyCharm有关的问题吗?

来自python终端的截图


你需要发布你的代码以便他人帮助你。否则,没有人能知道出了什么问题。 - mishsx
1
我只用过Ubuntu几次,但我认为这里发生的事情是Qt正在使用“本地”文件对话框,其内容由Ubuntu(如Unity/Gtk)提供,它可能会为下载创建一个“虚拟”文件夹,实际上存储在/run/user/<userid>/doc/中,或者使用~/Downloads路径作为虚拟文件夹,通过符号链接连接到实际文件。如果是这种情况,奇怪的是,默认情况下,QFileDialog应该遵循符号链接。 - musicamante
1
我建议您尝试创建一个普通的QFileDialog(而不是静态函数),将“DontUseNativeDialog”标志设置为True,以查看文件路径;此外,对于相同文件(在/run中和它们在~/Downloads中的对应文件),最好在两个文件路径上都执行ls -l,以查看它们是否是实际文件或符号链接;请注意,它们甚至可能是硬链接(但我怀疑这一点),在这种情况下,权限后面的数字表示引用计数,并且您可以使用ls -i检查inode号码以查看是否匹配。话虽如此,它也可能是一个fuse“hack”... - musicamante
3个回答

3

感谢 @musicamante 的帮助。如果我使用 PyCharm 运行代码,则需要使用 DontUseNativeDialog。在 PyCharm 外部运行时,该标志不是必需的。


2

我也遇到了同样的问题,最后我发现罪魁祸首是 Pycharm(在我的情况下), 尝试在终端中运行您的代码,您会看到它可以正常工作。并且在打包您的应用程序之后,它也将平稳运行。所以现在对我来说这不再是一个问题。


2

我正在使用PyCharm,遇到了同样的问题。像@musicamante建议的那样,选项"DontUseNativeDialog"也解决了我的问题。

QtWidgets.QFileDialog.getOpenFileName(parent=self, options=QtWidgets.QFileDialog.DontUseNativeDialog)

完美,这正是我所需要的。 - shredEngineer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接