PyQt5 - получает имя файла из открытого файла, а не путь к файлу

Допустим, я открыл файл с именем file1.mp3 в приложении PyQt5 с помощью диалогового окна файла и назначил его переменной следующим образом:

song = QFileDialog.getOpenFileName(self, "Open Song", "~", "Sound Files (*.mp3 *.ogg *.wav *.m4a)")
print(song[0])
url = QUrl.fromLocalFile(song[0])
self.playlist.addMedia(QMediaContent(url))

Как я могу получить имя файла вместо пути к файлу, чтобы отображать его в строке состояния? Или даже лучше, есть ли "играющая" функция, которую я мог бы использовать или создать?

3 ответа

Решение

Есть несколько простых способов получить имя файла:

  • С помощью QUrl:

song, _ = QFileDialog.getOpenFileName(self, "Open Song", "~", "Sound Files (*.mp3 *.ogg *.wav *.m4a)")
print(song)
url = QUrl.fromLocalFile(song)
self.playlist.addMedia(QMediaContent(url))
your_statusbar.showMessage("now playing {}".format(url.fileName()))
  • С помощью QFileInfo:

song, _ = QFileDialog.getOpenFileName(self, "Open Song", "~", "Sound Files (*.mp3 *.ogg *.wav *.m4a)")
print(song)
url = QUrl.fromLocalFile(song)
self.playlist.addMedia(QMediaContent(url))
filename = QFileInfo(song).fileName()
your_statusbar.showMessage("now playing {}".format(filename))
  • С помощью pathlib:

song, _ = QFileDialog.getOpenFileName(self, "Open Song", "~", "Sound Files (*.mp3 *.ogg *.wav *.m4a)")
print(song)
url = QUrl.fromLocalFile(song)
self.playlist.addMedia(QMediaContent(url))

from pathlib import Path    

filename = Path(song).name
your_statusbar.showMessage("now playing {}".format(filename))
  • С помощью os:

song, _ = QFileDialog.getOpenFileName(self, "Open Song", "~", "Sound Files (*.mp3 *.ogg *.wav *.m4a)")
print(song)
url = QUrl.fromLocalFile(song)
self.playlist.addMedia(QMediaContent(url))

import os   

filename = song.rstrip(os.sep)
your_statusbar.showMessage("now playing {}".format(filename))

или же:

song, _ = QFileDialog.getOpenFileName(self, "Open Song", "~", "Sound Files (*.mp3 *.ogg *.wav *.m4a)")
print(song)
url = QUrl.fromLocalFile(song)
self.playlist.addMedia(QMediaContent(url))

import os   

_ , filename = os.path.split(os.sep)
your_statusbar.showMessage("now playing {}".format(filename))

Самоочевидный. Вам просто нужно нарезать строку. И поскольку вы учитесь, я выберу неправильный путь, чтобы вы узнали, почему.

filepath = QFileDialog.getOpenFileName(self, "Open Song", "~", "Sound Files (*.mp3 *.ogg *.wav *.m4a)")[0]
filename = filepath.split("/")[-1]

print(filename)

После этого вы можете просто использовать

self.<statusbarname>.showMessage("Now playing {0} song or whatever".format(filename))

Однако это будет работать только на "некоторых" системах. Если вы хотите использовать это приложение на другом компьютере, сначала необходимо нормализовать путь (некоторые системы используют // и другие \ для папок), а затем разделить его с помощью безопасной встроенной команды.

import os # Careful with this library, Read the documentation first
filepath = os.path.normpath(filepath) # Normalize it
filename = filepath.split(os.sep) # Slice it

Весь код должен работать так:

import os
filepath = QFileDialog.getOpenFileName(self, "Open Song", "~", "Sound Files (*.mp3 *.ogg *.wav *.m4a)")[0]
print(filepath)
filepath = os.path.normpath(filepath)
song = filepath.split(os.sep)
url = QUrl.fromLocalFile(filepath)
self.playlist.addMedia(QMediaContent(url))
self.<statusbarname>.showMessage("Now playing {0} song or whatever and it was at {1} folder".format(song, filepath))

Программирование не волшебство, у вас есть путь к файлу, то есть: c://myfolder/song.mp3 - если ваши музыкальные файлы названы в честь песни, вы должны проанализировать URL для названия песни и установить заголовок / метку строки состояния на песня, которую вы сейчас играете. Я предлагаю вам пройти начальный курс по Python, прежде чем смешивать с ним фреймворки qt.

Другие вопросы по тегам