listwidget PyQt5 как привязать файл к элементу в списке
Я хочу чтобы при запуске программы в поле listwidget выводились все допустим .txt файлы, которые есть в директории.
По сути мне нужно чтобы элемент списка был привязан к файлу, например n.txt и при срабатывании функции, которая считывает нажатия по элементам открывался n.txt.
Проблема в том, что я не знаю как привязать элемент списка к файлу и как в функции сделать так чтобы при нажатии на элемент допустим item1 открывался n.txt, а на item2 o.txt.
У меня в мыслях, что такое возможно сделать через for.
код на pastebin https://pastebin.com/8NM1HziZ
Весь код:
import os
import sys
from pygame import mixer
from PyQt5 import QtGui, QtCore, QtWidgets
from PyQt5.QtWidgets import *
class Ui_MainWindow(object):
def setupUi(self, MainWindow):
MainWindow.setObjectName("MainWindow")
MainWindow.resize(640, 402)
MainWindow.setStyleSheet("background-color: qlineargradient(spread:pad, x1:0.182, y1:0.102409, x2:1, y2:1, stop:0.113636 rgba(0, 62, 79, 147), stop:0.306818 rgba(28, 14, 68, 156));")
self.centralwidget = QtWidgets.QWidget(MainWindow)
self.centralwidget.setObjectName("centralwidget")
self.label = QtWidgets.QLabel(self.centralwidget)
self.label.setGeometry(QtCore.QRect(-130, -40, 1031, 491))
self.label.setText("")
self.label.setPixmap(QtGui.QPixmap("2HYI.gif"))
self.label.setObjectName("label")
self.widget = QtWidgets.QWidget(self.centralwidget)
self.widget.setGeometry(QtCore.QRect(0, 310, 641, 80))
self.widget.setObjectName("widget")
self.listWidget = QtWidgets.QListWidget(self.centralwidget) #Начиная отсюда list
self.listWidget.setGeometry(QtCore.QRect(0, 0, 121, 311))
self.listWidget.setStyleSheet("font: 75 italic 8pt \"MS Sans Serif\";\n"
"color: rgb(121, 92, 121);")
self.listWidget.setObjectName("listWidget")
item = QtWidgets.QListWidgetItem()
font = QtGui.QFont()
font.setFamily("Roman")
font.setBold(True)
font.setItalic(True)
font.setWeight(75)
item.setFont(font)
self.listWidget.addItem(item)
item = QtWidgets.QListWidgetItem()
self.listWidget.addItem(item)
item = QtWidgets.QListWidgetItem()
self.listWidget.addItem(item)
item = QtWidgets.QListWidgetItem()
self.listWidget.addItem(item)
MainWindow.setCentralWidget(self.centralwidget)
self.statusbar = QtWidgets.QStatusBar(MainWindow)
self.statusbar.setObjectName("statusbar")
MainWindow.setStatusBar(self.statusbar)
self.retranslateUi(MainWindow)
QtCore.QMetaObject.connectSlotsByName(MainWindow)
def retranslateUi(self, MainWindow):
_translate = QtCore.QCoreApplication.translate
MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
__sortingEnabled = self.listWidget.isSortingEnabled()
self.listWidget.setSortingEnabled(False)
item=self.listWidget.item(0)
item.setText(_translate("MainWindow", "New Item")) #Элементы, пришло в голову что можно воспользоваться такой структурой
item = self.listWidget.item(1) #Но я всё равно не знаю как привязать элемент к файлу и как сделать открытие файла.
item.setText(_translate("MainWindow", "New Item"))
item = self.listWidget.item(2)
item.setText(_translate("MainWindow", "New Item"))
item = self.listWidget.item(3)
item.setText(_translate("MainWindow", 'w'))
self.listWidget.setSortingEnabled(__sortingEnabled)
class MainWindow(QMainWindow, Ui_MainWindow):
def __init__(self):
super().__init__()
self.setupUi(self)
self.itemlist = ['Item 1', 'Item 2', 'Item 3', 'Item 4', ] #список из элементов
self.listWidget.addItems(self.itemlist)
self.listWidget.itemClicked.connect(self.onClicked)
def onClicked(self, item): #При нажатии на элемент срабатывает функция и выводит "0"
print('0')
if __name__ == "__main__":
import sys
app = QtWidgets.QApplication(sys.argv)
w = MainWindow()
w.show()
sys.exit(app.exec_())
Часть с элементами.
def retranslateUi(self, MainWindow):
_translate = QtCore.QCoreApplication.translate
MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
__sortingEnabled = self.listWidget.isSortingEnabled()
self.listWidget.setSortingEnabled(False)
item=self.listWidget.item(0)
item.setText(_translate("MainWindow", "New Item")) #Элементы, пришло в голову что можно воспользоваться такой структурой
item = self.listWidget.item(1) #Но я всё равно не знаю как привязать элемент к файлу и как сделать открытие файла.
item.setText(_translate("MainWindow", "New Item"))
item = self.listWidget.item(2)
item.setText(_translate("MainWindow", "New Item"))
item = self.listWidget.item(3)
item.setText(_translate("MainWindow", 'w'))
self.listWidget.setSortingEnabled(__sortingEnabled)
class MainWindow(QMainWindow, Ui_MainWindow):
def __init__(self):
super().__init__()
self.setupUi(self)
self.itemlist = ['Item 1', 'Item 2', 'Item 3', 'Item 4', ] #список из элементов
self.listWidget.addItems(self.itemlist)
self.listWidget.itemClicked.connect(self.onClicked)
def onClicked(self, item): #При нажатии на элемент срабатывает функция и выводит "0"
print('0')
Отвечать на то, как получить список файлов в директории не обязательно, мне важна лишь возможность привязки элементов к файлам.
Ответы (2 шт):
К каждому элементу вы можете привязать собственные данные любого типа (QVariant). Используйте для этого setData с ролью Qt.UserRole.
self.listWidget.addItem("my new item");
self.listWidget.item(0).setData(Qt.UserRole, "my data")
Для того чтобы получить ассоциированные с элементом данные, используйте соответственно data(Qt.UserRole)
def onClicked(self, item):
print(item.data(Qt.UserRole));
Вот вам реализация того, что вам рассказал @SergeyTatarincev, а также другие полезные вещи.
import os
import sys
# ?from pygame import mixer
from PyQt5 import QtGui, QtCore, QtWidgets
from PyQt5.Qt import *
class Ui_MainWindow(object):
def setupUi(self, MainWindow):
MainWindow.setObjectName("MainWindow")
MainWindow.resize(640, 480)
MainWindow.setStyleSheet("""
#centralwidget, QListWidget {
background-color: qlineargradient(\
spread: pad, x1:0.182, y1:0.102409, x2:1, y2:1, \
stop:0.113636 rgba(0, 62, 79, 147), \
stop:0.306818 rgba(28, 14, 68, 156));
}
""")
self.centralwidget = QtWidgets.QWidget(MainWindow)
self.centralwidget.setObjectName("centralwidget")
self.label = QtWidgets.QLabel(self.centralwidget)
self.label.setGeometry(QtCore.QRect(-130, -40, 1031, 491))
self.label.setText("")
self.label.setPixmap(
QtGui.QPixmap("opencv_color.jpg").scaled(1031, 520)) # !!!
self.label.setObjectName("label")
self.widget = QtWidgets.QWidget(self.centralwidget)
self.widget.setGeometry(QtCore.QRect(0, 310, 641, 150))
self.widget.setObjectName("widget")
self.widget.setStyleSheet("background-color: #035397 ;") # +
self.listWidget = QtWidgets.QListWidget(self.centralwidget)
self.listWidget.setGeometry(QtCore.QRect(0, 0, 121, 311))
self.listWidget.setStyleSheet("font: 75 italic 12pt \"MS Sans Serif\";\n"
"color: rgb(121, 192, 221);")
self.listWidget.setObjectName("listWidget")
item = QtWidgets.QListWidgetItem()
font = QtGui.QFont()
font.setFamily("Roman")
font.setBold(True)
font.setItalic(True)
font.setWeight(75)
item.setFont(font)
self.listWidget.addItem(item)
item = QtWidgets.QListWidgetItem()
self.listWidget.addItem(item)
item = QtWidgets.QListWidgetItem()
self.listWidget.addItem(item)
item = QtWidgets.QListWidgetItem()
self.listWidget.addItem(item)
MainWindow.setCentralWidget(self.centralwidget)
self.statusbar = QtWidgets.QStatusBar(MainWindow)
self.statusbar.setObjectName("statusbar")
MainWindow.setStatusBar(self.statusbar)
self.retranslateUi(MainWindow)
QtCore.QMetaObject.connectSlotsByName(MainWindow)
def retranslateUi(self, MainWindow):
_translate = QtCore.QCoreApplication.translate
MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
__sortingEnabled = self.listWidget.isSortingEnabled()
self.listWidget.setSortingEnabled(False)
item=self.listWidget.item(0)
item.setText(_translate("MainWindow", "New Item"))
item = self.listWidget.item(1)
item.setText(_translate("MainWindow", "New Item"))
item = self.listWidget.item(2)
item.setText(_translate("MainWindow", "New Item"))
item = self.listWidget.item(3)
item.setText(_translate("MainWindow", 'w'))
self.listWidget.setSortingEnabled(__sortingEnabled)
class VLine(QFrame): # +++
def __init__(self):
super(VLine, self).__init__()
self.setFrameShape(self.VLine|self.Sunken)
class MainWindow(QMainWindow, Ui_MainWindow):
def __init__(self):
super().__init__()
self.setupUi(self)
self.listWidget.clear() # !!!
self.listWidget.itemClicked.connect(self.onClicked)
self.textEdit = QtWidgets.QTextEdit()
self.textEdit.setStyleSheet(
"background-color: #035397; color: #FFAA4C; font-size: 15px;")
layout = QtWidgets.QVBoxLayout(self.widget)
layout.addWidget(self.textEdit)
btn_dir = QPushButton('Выберите папку')
btn_dir.clicked.connect(self.update_dir)
self.statusBar().showMessage("bla-bla bla")
self.statusBar().reformat()
self.statusBar().setStyleSheet('''
QStatusBar {
border: 0;
background-color: #ccc;
color: #FFAA4C;
}
QStatusBar::item {border: none;}
''')
self.statusBar().addPermanentWidget(VLine())
self.statusBar().addPermanentWidget(btn_dir)
self.statusBar().addPermanentWidget(VLine())
_date = QDate().currentDate()
self.statusBar().addPermanentWidget(QLabel(f"Data :{_date.toString('dd.MM.yyyy')}"))
self.statusBar().addPermanentWidget(VLine())
def onClicked(self, item):
path_file = item.data(QtCore.Qt.UserRole)
with open(path_file, 'r') as file:
self.textEdit.setText(file.read())
def update_dir(self):
directory = QFileDialog.getExistingDirectory(
self,
"QFileDialog.getExistingDirectory()",
'.'
)
if directory:
_list = [ file for file in os.listdir(f"{directory}") if file.endswith(".txt") ] #/*.txt")]
if not _list:
return
self.listWidget.clear()
for i, item in enumerate(_list):
self.listWidget.addItem(item)
item_data = os.path.join(directory, item).replace('\\', '/')
self.listWidget.item(i).setData(QtCore.Qt.UserRole, item_data)
if __name__ == "__main__":
import sys
app = QtWidgets.QApplication(sys.argv)
w = MainWindow()
w.show()
sys.exit(app.exec_())
