Загрузка данных
from PyQt6.QtWidgets import *
from PyQt6.QtGui import QPixmap
from PyQt6.QtCore import Qt
from database import get_connection
class Window(QWidget):
def __init__(self):
super().__init__()
self.setWindowTitle("Фотографии пользователей")
self.resize(700, 600)
# Главный вертикальный layout
self.main_layout = QVBoxLayout(self)
# Область прокрутки
self.scroll = QScrollArea()
self.scroll.setWidgetResizable(True)
# Контейнер для карточек
self.container = QWidget()
self.users_layout = QVBoxLayout(self.container)
self.scroll.setWidget(self.container)
self.main_layout.addWidget(self.scroll)
# Загружаем пользователей
self.load_users()
# Удаление старых карточек
def clear_layout(self):
while self.users_layout.count():
item = self.users_layout.takeAt(0)
if item.widget():
item.widget().deleteLater()
# Загрузка пользователей из базы
def load_users(self):
self.clear_layout()
connection = None
try:
connection = get_connection()
with connection.cursor() as cursor:
cursor.execute("SELECT * FROM users")
users = cursor.fetchall()
# Создаём карточку для каждого пользователя
for user in users:
# Карточка
frame = QFrame()
frame.setFrameShape(QFrame.Shape.Box)
card_layout = QHBoxLayout(frame)
# Блок с текстом
text_layout = QVBoxLayout()
text_layout.addWidget(
QLabel(f"Имя: {user['first_name']}")
)
text_layout.addWidget(
QLabel(f"Фамилия: {user['last_name']}")
)
text_layout.addWidget(
QLabel(f"Логин: {user['login']}")
)
# Место для фотографии
photo = QLabel()
photo.setFixedSize(120, 120)
photo.setAlignment(
Qt.AlignmentFlag.AlignCenter
)
# Проверяем, есть ли фотография
if user["photo"]:
pixmap = QPixmap(user["photo"])
if not pixmap.isNull():
photo.setPixmap(
pixmap.scaled(
120,
120,
Qt.AspectRatioMode.KeepAspectRatio
)
)
else:
photo.setText("Фото не найдено")
else:
photo.setText("Нет фотографии")
# Кнопка выбора фотографии
photo_button = QPushButton("Выбрать фото")
# Передаём ID конкретного пользователя
photo_button.clicked.connect(
lambda checked, user_id=user["id"]:
self.select_photo(user_id)
)
# Добавляем кнопку и фотографию в карточку
text_layout.addWidget(photo_button)
card_layout.addLayout(text_layout)
card_layout.addWidget(photo)
# Добавляем карточку в общий список
self.users_layout.addWidget(frame)
if not users:
self.users_layout.addWidget(
QLabel("Пользователи не найдены")
)
except Exception as e:
QMessageBox.critical(
self,
"Ошибка",
f"Ошибка загрузки пользователей:\n{e}"
)
finally:
if connection:
connection.close()
# Выбор и сохранение фотографии
def select_photo(self, user_id):
# Открываем окно выбора файла
path, _ = QFileDialog.getOpenFileName(
self,
"Выберите фотографию",
"",
"Изображения (*.png *.jpg *.jpeg *.bmp)"
)
# Если пользователь нажал Отмена
if not path:
return
connection = None
try:
connection = get_connection()
with connection.cursor() as cursor:
sql = """
UPDATE users
SET photo = %s
WHERE id = %s
"""
cursor.execute(sql, (path, user_id))
connection.commit()
QMessageBox.information(
self,
"Успех",
"Фотография успешно сохранена!"
)
# Обновляем карточки
self.load_users()
except Exception as e:
QMessageBox.critical(
self,
"Ошибка",
f"Не удалось сохранить фотографию:\n{e}"
)
finally:
if connection:
connection.close()
# Запуск программы
app = QApplication([])
window = Window()
window.show()
app.exec()