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.