Как создать объект (класс, экземпляр, кнопку в gui) с заранее неизвестным именем в Python, PyQt? Скрипт вытягивает из другого файла некоторые данные, заранее неизвестные. и делает из них словарь по типу: info = {date: {finished: {id : time}}} хотелось бы в PyQt сделать отдельную кнопку для каждой даты (количество их заранее не известно) при нажатии на которую показывались другие детали Подскажите пожалуйста как ето можно сделать? Ето как то нужно динамически задавать имена кнопок. И как то к ним нужно обращаться после пс и еще второй вопрос, как то можно подобные данные записать не в словаре а в классе или экземпляре
Для создания объектов (кнопок) с заранее неизвестными именами в PyQt вы можете использовать словарь, где ключами будут имена кнопок, а значениями сами объекты кнопок.
Пример создания кнопок с динамическими именами и их обработчиками:
import sys from PyQt5.QtWidgets import QApplication, QWidget, QPushButton, QVBoxLayout class MyWidget(QWidget): def __init__(self, data): super().__init__() layout = QVBoxLayout(self) self.buttons = {} for date, info in data.items(): button = QPushButton(date) button.clicked.connect(lambda _, date=date: self.show_details(date)) self.buttons[date] = info layout.addWidget(button) def show_details(self, date): print(self.buttons[date]) # Здесь можно реализовать вывод дополнительных деталей if __name__ == '__main__': app = QApplication(sys.argv) data = { '2022-01-01': {'finished': {1: '10:00', 2: '11:00'}}, '2022-02-01': {'finished': {3: '12:00', 4: '13:00'}} } window = MyWidget(data) window.show() sys.exit(app.exec_())
Чтобы данные хранились не в словаре, а в классе или экземпляре, можно создать отдельный класс или использовать атрибуты класса/экземпляра для хранения данных. Например:
class DataHolder: def __init__(self): self.info = {} def add_data(self, date, finished_info): self.info[date] = finished_info def get_data(self): return self.info class MyWidget(QWidget): def __init__(self, data_holder): super().__init__() layout = QVBoxLayout(self) self.data_holder = data_holder for date, info in self.data_holder.get_data().items(): button = QPushButton(date) button.clicked.connect(lambda _, date=date: self.show_details(date)) layout.addWidget(button) def show_details(self, date): print(self.data_holder.get_data()[date]) # Здесь можно реализовать вывод дополнительных деталей if __name__ == '__main__': app = QApplication(sys.argv) data_holder = DataHolder() data_holder.add_data('2022-01-01', {'finished': {1: '10:00', 2: '11:00'}}) data_holder.add_data('2022-02-01', {'finished': {3: '12:00', 4: '13:00'}}) window = MyWidget(data_holder) window.show() sys.exit(app.exec_())
Таким образом, вы можете динамически создавать кнопки с разными именами и связывать их с различными обработчиками, а также хранить данные в отдельном классе или экземпляре.
Для создания объектов (кнопок) с заранее неизвестными именами в PyQt вы можете использовать словарь, где ключами будут имена кнопок, а значениями сами объекты кнопок.
Пример создания кнопок с динамическими именами и их обработчиками:
import sysfrom PyQt5.QtWidgets import QApplication, QWidget, QPushButton, QVBoxLayout
class MyWidget(QWidget):
def __init__(self, data):
super().__init__()
layout = QVBoxLayout(self)
self.buttons = {}
for date, info in data.items():
button = QPushButton(date)
button.clicked.connect(lambda _, date=date: self.show_details(date))
self.buttons[date] = info
layout.addWidget(button)
def show_details(self, date):
print(self.buttons[date]) # Здесь можно реализовать вывод дополнительных деталей
if __name__ == '__main__':
app = QApplication(sys.argv)
data = {
'2022-01-01': {'finished': {1: '10:00', 2: '11:00'}},
'2022-02-01': {'finished': {3: '12:00', 4: '13:00'}}
}
window = MyWidget(data)
window.show()
sys.exit(app.exec_())
Чтобы данные хранились не в словаре, а в классе или экземпляре, можно создать отдельный класс или использовать атрибуты класса/экземпляра для хранения данных. Например:
class DataHolder:def __init__(self):
self.info = {}
def add_data(self, date, finished_info):
self.info[date] = finished_info
def get_data(self):
return self.info
class MyWidget(QWidget):
def __init__(self, data_holder):
super().__init__()
layout = QVBoxLayout(self)
self.data_holder = data_holder
for date, info in self.data_holder.get_data().items():
button = QPushButton(date)
button.clicked.connect(lambda _, date=date: self.show_details(date))
layout.addWidget(button)
def show_details(self, date):
print(self.data_holder.get_data()[date]) # Здесь можно реализовать вывод дополнительных деталей
if __name__ == '__main__':
app = QApplication(sys.argv)
data_holder = DataHolder()
data_holder.add_data('2022-01-01', {'finished': {1: '10:00', 2: '11:00'}})
data_holder.add_data('2022-02-01', {'finished': {3: '12:00', 4: '13:00'}})
window = MyWidget(data_holder)
window.show()
sys.exit(app.exec_())
Таким образом, вы можете динамически создавать кнопки с разными именами и связывать их с различными обработчиками, а также хранить данные в отдельном классе или экземпляре.