【发布时间】:2019-08-25 14:27:20
【问题描述】:
我正在使用这段代码打开一个文件对话框并返回选定的文件名(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 相关的问题吗?
【问题讨论】:
-
您必须发布代码以供他人帮助。没有它,没有人知道出了什么问题。
-
我只使用过几次 Ubuntu,但我认为这里发生的事情是 Qt 正在使用“本机”文件对话框,其内容由 Ubuntu 提供(如 Unity/ Gtk),它可能会为下载创建一个“虚拟”文件夹,实际上存储在
/run/user/<userid>/doc/或使用~/Downloads路径作为虚拟文件夹,它链接到实际文件通过符号链接。如果是这样的话,这里奇怪的是,默认情况下,QFileDialog 应该遵循符号链接。 -
我建议您尝试创建一个普通的 QFileDialog(无静态函数),将
DontUseNativeDialog标志设置为 True,以查看文件路径;此外,最好在两个文件路径上为相同文件(/run中的文件和~/Downloads中的对应文件)执行ls -l,以查看它们是实际文件还是符号链接;请注意,它们甚至可能是硬链接(但我对此表示怀疑),在这种情况下,权限后面的数字表示引用计数,您可以使用ls -i检查 inode 编号以查看它是否匹配。也就是说,它也可能是一个保险丝“黑客”......
标签: python linux ubuntu pycharm pyqt5