Anonymous
Почему моя кнопка удаляет все книги с одинаковыми атрибутами?
Сообщение
Anonymous » 25 янв 2025, 04:21
Итак, я использую Pyqt5 и Python для создания этой виртуальной библиотеки, но у меня есть проблема в кнопке on_click_remove. Проблема в том, что она удаляет Everything с тем же атрибутом, как и если у меня есть две книги под названием «One_piece», и я попытался только только Удалить один другой также будет удален, я попробовал несколько подходов, но ни один из них не работает, это мой код: < /p>
Код: Выделить всё
import sys
from PyQt5.QtWidgets import QApplication,QLineEdit,QVBoxLayout,QWidget,QPushButton,QListWidget,QMessageBox
from PyQt5.QtGui import QIcon
import books
import pandas as pd
class MainWindow(QWidget):
def __init__(self):
super().__init__()
self.setGeometry(100,100,800,800)
self.setWindowTitle("Virtual Library")
self.setWindowIcon(QIcon("bookshelf.png"))
self.vbox=QVBoxLayout()
try:
self.df = pd.read_csv("thelibraryy.csv")
except FileNotFoundError:
self.df = pd.DataFrame(columns=["Title", "Author", "Year", "Genre","Content"])
i=0
listo=[]
while self.df.shape[0]>i:
listo.append(f'the book {{{self.df["Title"][i]}}} by {{{self.df["Author"][i]}}} written in {{{self.df["Year"][i]}}} and its {{{self.df["Genre"][i]}}}')
i+=1
self.book_list = QListWidget()
self.vbox.addWidget(self.book_list)
self.book_list.setStyleSheet("font-size:20px ;")
self.book_list.addItems(listo)
self.data_info={}
self.Labels()
self.title=self.data_info['Title'].text()
self.author=self.data_info['Author'].text()
self.year=self.data_info['Year'].text()
self.genre=self.data_info['Genre'].text()
self.Buttons()
def Labels(self):
self.names=['Title','Author','Year','Genre']
for name in self.names:
self.field=QLineEdit(self)
self.field.setPlaceholderText(f"Enter the {name} ...")
self.field.setStyleSheet("font-size:20px; ")
self.vbox.addWidget(self.field)
self.data_info[name]=self.field
self.setLayout(self.vbox)
return self.data_info
def Buttons(self):
self.add=QPushButton("Add")
self.vbox.addWidget(self.add)
self.add.clicked.connect(self.on_click_add)
self.remove=QPushButton("Remove")
self.vbox.addWidget(self.remove)
self.remove.clicked.connect(self.on_click_remove)
self.edit=QPushButton("Edit")
self.vbox.addWidget(self.edit)
self.edit.clicked.connect(self.on_click_edit)
buttons=[self.add,self.remove,self.edit]
for i in buttons:
i.setStyleSheet("""
QPushButton {
background-color:rgba(255, 255, 255, 0.5);
color: black;
font-size: 25px;
border: 2px solid #0078D7;
border-radius: 20px;
padding: 10px;
}
QPushButton:hover {
background-color:rgb(0, 170, 255);
color: white;}""")
def on_click_add(self):
self.title = self.data_info['Title'].text()
self.author = self.data_info['Author'].text()
self.year = self.data_info['Year'].text()
self.genre = self.data_info['Genre'].text()
if not self.year.isdigit():
QMessageBox.warning(self,"Input Error",f"Year Must Be A number not {self.year}")
return
if (self.title and self.author and self.year and self.genre):
if not self.df[(self.df["Title"]==self.title) & (self.df["Author"]==self.author) &(self.df["Year"]==self.year) &(self.df["Genre"]==self.genre)].empty:
QMessageBox.warning(self,"Input Error",f"this book {self.author} already Exist in the library ")
else:
book = books.Books(title=self.title, author=self.author, year=self.year, genre=self.genre,content=self.title.replace(" ","_")+".txt")
frame = pd.DataFrame([{"Title": book.title, "Author": book.author, "Year": book.year, "Genre": book.genre,"Content":book.content}])
self.df=pd.concat([self.df,frame],axis=0,ignore_index=True)
self.df.to_csv("thelibraryy.csv", index=False)
self.book_list.addItem(f'the book {{{self.title}}} by {{{self.author}}} written in {{{self.year}}} and its {{{self.genre}}}')
print("book is added to the library")
for names,labels in self.data_info.items():
labels.setText("")
else:
QMessageBox.warning(self,"Input Error","You Forgot to Fill a Label")
def on_click_remove(self):
self.selected_item=self.book_list.currentItem()
if self.selected_item:
self.item_text = self.selected_item.text()
self.start_of_title = self.item_text.find("{") + 1
self.end_of_title = self.item_text.find("}")
self.text_title = self.item_text[self.start_of_title:self.end_of_title]
self.start_of_author = self.item_text.find("by") + 5
self.end_of_author = self.item_text.find("written")-3
self.text_author = self.item_text[self.start_of_author:self.end_of_author]
self.start_of_year = self.item_text.find("written in") + 13
self.end_of_year = self.item_text.find("and its")-3
self.text_year = self.item_text[self.start_of_year:self.end_of_year]
self.start_of_genre = self.item_text.find("its") + 6
self.text_genre = self.item_text[self.start_of_genre:-1]
self.df = self.df[((self.df['Title'] != self.text_title) &
(self.df['Author'] != self.text_author) &
(self.df['Year'] != self.text_year) &
(self.df['Genre'] != self.text_genre))]
self.df.to_csv("thelibraryy.csv", index=False)
self.book_list.takeItem(self.book_list.row(self.selected_item))
else:
QMessageBox.warning(self,"Selection Error","You Didn't Select Any Row")
def on_click_edit(self):
self.selected_item=self.book_list.currentItem()
if self.selected_item:
self.book_list.takeItem(self.book_list.row(self.selected_item))
self.item_text = self.selected_item.text()
self.start_of_title = self.item_text.find("{") + 1
self.end_of_title = self.item_text.find("}")
self.text_title = self.item_text[self.start_of_title:self.end_of_title]
self.start_of_author = self.item_text.find("by") + 5
self.end_of_author = self.item_text.find("written")-3
self.text_author = self.item_text[self.start_of_author:self.end_of_author]
self.start_of_year = self.item_text.find("written in") + 13
self.end_of_year = self.item_text.find("and its")-3
self.text_year = self.item_text[self.start_of_year:self.end_of_year]
self.start_of_genre = self.item_text.find("its") + 6
self.text_genre = self.item_text[self.start_of_genre:-1]
self.df=self.df[~(self.df['Title']==self.text_title)]
self.df.to_csv("thelibraryy.csv", index=False)
items={'Title':self.text_title,"Author":self.text_author,"Year":self.text_year,"Genre":self.text_genre}
for names,labels in self.data_info.items():
labels.setText(items[names])
else:
QMessageBox.warning(self,"Selection Error","You Didn't Select Any Row")
def main():
app = QApplication(sys.argv)
window = MainWindow()
window.show()
sys.exit(app.exec_())
if __name__ == "__main__":
main()
Я ценю любую помощь и спасибо в Advanced
Подробнее здесь:
https://stackoverflow.com/questions/793 ... attributes
1737768108
Anonymous
Итак, я использую Pyqt5 и Python для создания этой виртуальной библиотеки, но у меня есть проблема в кнопке on_click_remove. Проблема в том, что она удаляет Everything с тем же атрибутом, как и если у меня есть две книги под названием «One_piece», и я попытался только только Удалить один другой также будет удален, я попробовал несколько подходов, но ни один из них не работает, это мой код: < /p> [code]import sys from PyQt5.QtWidgets import QApplication,QLineEdit,QVBoxLayout,QWidget,QPushButton,QListWidget,QMessageBox from PyQt5.QtGui import QIcon import books import pandas as pd class MainWindow(QWidget): def __init__(self): super().__init__() self.setGeometry(100,100,800,800) self.setWindowTitle("Virtual Library") self.setWindowIcon(QIcon("bookshelf.png")) self.vbox=QVBoxLayout() try: self.df = pd.read_csv("thelibraryy.csv") except FileNotFoundError: self.df = pd.DataFrame(columns=["Title", "Author", "Year", "Genre","Content"]) i=0 listo=[] while self.df.shape[0]>i: listo.append(f'the book {{{self.df["Title"][i]}}} by {{{self.df["Author"][i]}}} written in {{{self.df["Year"][i]}}} and its {{{self.df["Genre"][i]}}}') i+=1 self.book_list = QListWidget() self.vbox.addWidget(self.book_list) self.book_list.setStyleSheet("font-size:20px ;") self.book_list.addItems(listo) self.data_info={} self.Labels() self.title=self.data_info['Title'].text() self.author=self.data_info['Author'].text() self.year=self.data_info['Year'].text() self.genre=self.data_info['Genre'].text() self.Buttons() def Labels(self): self.names=['Title','Author','Year','Genre'] for name in self.names: self.field=QLineEdit(self) self.field.setPlaceholderText(f"Enter the {name} ...") self.field.setStyleSheet("font-size:20px; ") self.vbox.addWidget(self.field) self.data_info[name]=self.field self.setLayout(self.vbox) return self.data_info def Buttons(self): self.add=QPushButton("Add") self.vbox.addWidget(self.add) self.add.clicked.connect(self.on_click_add) self.remove=QPushButton("Remove") self.vbox.addWidget(self.remove) self.remove.clicked.connect(self.on_click_remove) self.edit=QPushButton("Edit") self.vbox.addWidget(self.edit) self.edit.clicked.connect(self.on_click_edit) buttons=[self.add,self.remove,self.edit] for i in buttons: i.setStyleSheet(""" QPushButton { background-color:rgba(255, 255, 255, 0.5); color: black; font-size: 25px; border: 2px solid #0078D7; border-radius: 20px; padding: 10px; } QPushButton:hover { background-color:rgb(0, 170, 255); color: white;}""") def on_click_add(self): self.title = self.data_info['Title'].text() self.author = self.data_info['Author'].text() self.year = self.data_info['Year'].text() self.genre = self.data_info['Genre'].text() if not self.year.isdigit(): QMessageBox.warning(self,"Input Error",f"Year Must Be A number not {self.year}") return if (self.title and self.author and self.year and self.genre): if not self.df[(self.df["Title"]==self.title) & (self.df["Author"]==self.author) &(self.df["Year"]==self.year) &(self.df["Genre"]==self.genre)].empty: QMessageBox.warning(self,"Input Error",f"this book {self.author} already Exist in the library ") else: book = books.Books(title=self.title, author=self.author, year=self.year, genre=self.genre,content=self.title.replace(" ","_")+".txt") frame = pd.DataFrame([{"Title": book.title, "Author": book.author, "Year": book.year, "Genre": book.genre,"Content":book.content}]) self.df=pd.concat([self.df,frame],axis=0,ignore_index=True) self.df.to_csv("thelibraryy.csv", index=False) self.book_list.addItem(f'the book {{{self.title}}} by {{{self.author}}} written in {{{self.year}}} and its {{{self.genre}}}') print("book is added to the library") for names,labels in self.data_info.items(): labels.setText("") else: QMessageBox.warning(self,"Input Error","You Forgot to Fill a Label") def on_click_remove(self): self.selected_item=self.book_list.currentItem() if self.selected_item: self.item_text = self.selected_item.text() self.start_of_title = self.item_text.find("{") + 1 self.end_of_title = self.item_text.find("}") self.text_title = self.item_text[self.start_of_title:self.end_of_title] self.start_of_author = self.item_text.find("by") + 5 self.end_of_author = self.item_text.find("written")-3 self.text_author = self.item_text[self.start_of_author:self.end_of_author] self.start_of_year = self.item_text.find("written in") + 13 self.end_of_year = self.item_text.find("and its")-3 self.text_year = self.item_text[self.start_of_year:self.end_of_year] self.start_of_genre = self.item_text.find("its") + 6 self.text_genre = self.item_text[self.start_of_genre:-1] self.df = self.df[((self.df['Title'] != self.text_title) & (self.df['Author'] != self.text_author) & (self.df['Year'] != self.text_year) & (self.df['Genre'] != self.text_genre))] self.df.to_csv("thelibraryy.csv", index=False) self.book_list.takeItem(self.book_list.row(self.selected_item)) else: QMessageBox.warning(self,"Selection Error","You Didn't Select Any Row") def on_click_edit(self): self.selected_item=self.book_list.currentItem() if self.selected_item: self.book_list.takeItem(self.book_list.row(self.selected_item)) self.item_text = self.selected_item.text() self.start_of_title = self.item_text.find("{") + 1 self.end_of_title = self.item_text.find("}") self.text_title = self.item_text[self.start_of_title:self.end_of_title] self.start_of_author = self.item_text.find("by") + 5 self.end_of_author = self.item_text.find("written")-3 self.text_author = self.item_text[self.start_of_author:self.end_of_author] self.start_of_year = self.item_text.find("written in") + 13 self.end_of_year = self.item_text.find("and its")-3 self.text_year = self.item_text[self.start_of_year:self.end_of_year] self.start_of_genre = self.item_text.find("its") + 6 self.text_genre = self.item_text[self.start_of_genre:-1] self.df=self.df[~(self.df['Title']==self.text_title)] self.df.to_csv("thelibraryy.csv", index=False) items={'Title':self.text_title,"Author":self.text_author,"Year":self.text_year,"Genre":self.text_genre} for names,labels in self.data_info.items(): labels.setText(items[names]) else: QMessageBox.warning(self,"Selection Error","You Didn't Select Any Row") def main(): app = QApplication(sys.argv) window = MainWindow() window.show() sys.exit(app.exec_()) if __name__ == "__main__": main() [/code] Я ценю любую помощь и спасибо в Advanced Подробнее здесь: [url]https://stackoverflow.com/questions/79386035/why-does-my-button-remove-all-the-books-with-the-same-attributes[/url]