Форум программистов, компьютерный форум, киберфорум
Python: Решение задач
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.80/5: Рейтинг темы: голосов - 5, средняя оценка - 4.80
 Аватар для DjonyCooper
10 / 7 / 4
Регистрация: 28.05.2021
Сообщений: 136

Динамическое создание QPushButton с последующим сохранением в ini файл

04.10.2022, 21:30. Показов 1218. Ответов 6

Студворк — интернет-сервис помощи студентам
проблема с динамическим созданием кнопок. Пишу приложение, нужно:

1. Динамически создавать кнопки, которые по сути будут ярлыками на внешние программы.
2. При необходимости, удалять нужную кнопку, чтобы остальные смещались согласно макету.
3. Сохранять конфигурацию в ini файл, чтобы после перезапуска все созданные кнопки сохранялись.

Что есть на сейчас:

1. Кнопки динамически создаются согласно Grid макету и могут запускать прикрепленный к ним exe файл, но только тот, что был прикреплен последним.
2. Удаление работает только на последнюю созданную кнопку по клику по ней правой кнопкой мыши.
3. Получается сохранить конфиг кнопки в файл settings.ini - но не могу извлечь данные при запуске программы.
Если у кого будут мысли, буду безмерно благодарен. Прикладываю минимально работающий пример.

Файл main.py:
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
from PyQt5.QtWidgets import QWidget, QApplication, QGridLayout, QGroupBox, QPushButton, QMessageBox, QMenu
from PyQt5.QtCore import QEvent, QSettings, Qt
from PyQt5.QtGui import QIcon
 
class Main(QWidget):
 
    settings = QSettings("settings.ini", QSettings.IniFormat)
 
    def __init__(self):
        super(Main, self).__init__()
        self.setWindowTitle('Образец')
        self.resize(500, 300)
 
        grid = QGridLayout()
        grid.addWidget(self.prog_group_box(), 0, 0, 1, 1)
        grid.addWidget(self.b_new_prog(), 1, 0, Qt.AlignRight)
 
        self.setLayout(grid)
 
    def prog_group_box(self):
        groupBox1 = QGroupBox(self)
        self.grid_prog = QGridLayout()
        groupBox1.setLayout(self.grid_prog)
 
        return groupBox1
 
    def saved_conf(self):
        # Сохранение созданной кнопки в ini файл
        self.settings.setValue('button', self.new_but)
        self.settings.setValue('label', self.click_newprog._leProgLabel.text())
        self.settings.setValue('source', self.click_newprog._leReview.text())
        self.settings.sync()
 
    # def restore_settings(self):
    # Функция восстановления сохраненного конфига из ini файла
        # test = self.settings.setValue('button')
 
        # print(f'RESTORE: {test}')
 
    def delete_setting(self):
        # Функция удаления данных из ini файла с сохраненной конфигурацией
        self.settings = QSettings("settings.ini", QSettings.IniFormat)
        self.settings.remove('button')
 
    def b_new_prog(self):
        self.b_new_prog = QPushButton(self)
        self.b_new_prog.setText("Добавить")
        self.b_new_prog.setMinimumSize(129, 43)
        self.b_new_prog.clicked.connect(self.click_newprog)
 
        return self.b_new_prog
 
    def click_newprog(self):
        from second import Second
        self.click_newprog = Second(self)
        self.click_newprog.show()
 
    def create_new_button(self):
        self.new_but = QPushButton()
        self.new_but.setFixedSize(70, 70)
        self.new_but.clicked.connect(self.btnClicked)
        self.new_but.setText(self.click_newprog._leProgLabel.text())
        self.grid_prog.addWidget(self.new_but, 0, 0)
        i = self.grid_prog.count() - 1
        self.grid_prog.addWidget(self.new_but, 1 + i // 8, i % 8)
        self.new_but.installEventFilter(self)
 
    def btnClicked(self):
        import os
        os.startfile(self.click_newprog._leReview.text())
 
    # Контекстное меню
    def eventFilter(self, source, event):
        if event.type() == QEvent.ContextMenu and source is self.new_but:
            menu = QMenu()
            menu.addAction('Удалить')
 
            if menu.exec_(event.globalPos()):
                reply = QMessageBox.question(
                    self,
                    'Message', "Вы действительно хотите удалить?",
                    QMessageBox.Yes | QMessageBox.No,
                    QMessageBox.No
                    )
                if reply == QMessageBox.Yes:
                    self.new_but.hide()
                    self.delete_setting()
                else:
                    pass
 
        return super().eventFilter(source, event)
 
if __name__ == ('__main__'):
    import sys
    app = QApplication(sys.argv)
    w = Main()
    w.show()
    sys.exit(app.exec_())
файл second.py:

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
from PyQt5.QtWidgets import (QLabel, QVBoxLayout, QLineEdit, QPushButton,
                             QHBoxLayout, QFileDialog, QMessageBox, QDialog)
from PyQt5.QtCore import Qt
from PyQt5.QtGui import QFont
 
 
class Second(QDialog):
    def __init__(self, Main):
        super().__init__()
        self.main = Main
        self.setMinimumSize(300, 160)
        self.setWindowFlags(Qt.Dialog)
 
        vbox = QVBoxLayout()
        hbox = QHBoxLayout()
        hbox.addWidget(self._lProgLabel())
        hbox.addWidget(self._leProgLabel())
        vbox.addLayout(hbox)
        vbox.addWidget(self._lReview())
        hbox2 = QHBoxLayout()
        hbox2.addWidget(self._leReview())
        hbox2.addWidget(self._bReview())
        vbox.addLayout(hbox2)
        hbox3 = QHBoxLayout()
        hbox3.addWidget(self.b_create())
        hbox3.addWidget(self.b_close())
        vbox.addLayout(hbox3)
        self.setLayout(vbox)
 
    def _lProgLabel(self):
        _lProgLabel = QLabel(self)
        _lProgLabel.setText('<center style=font-size:10pt><FONT FACE="Century Gothic">Название кнопки:</center>')
 
        return _lProgLabel
 
    def _leProgLabel(self):
        self._leProgLabel = QLineEdit(self)
        self._leProgLabel.setFont(QFont('Century Gothic', 10))
 
        return self._leProgLabel
 
    def _lReview(self):
        _lreview = QLabel(self)
        _lreview.setText(
            '<center style=font-size:10pt><FONT FACE="Century Gothic">Укажите путь к программе или нажмите "Обзор":</center>')
 
        return _lreview
 
    def _leReview(self):
        self._leReview = QLineEdit(self)
        self._leReview.setFixedSize(250, 30)
        self._leReview.setFont(QFont('Century Gothic', 10))
 
        return self._leReview
 
    def _bReview(self):
        _breview = QPushButton()
        _breview.setFixedSize(90, 30)
        _breview.setText("Обзор")
        _breview.clicked.connect(self.browseFiles)
 
        return _breview
 
    def browseFiles(self):
        fname = QFileDialog.getOpenFileName(self, 'Open file', 'C:\Program Files', 'exe files (*.exe)')
        self._leReview.setText(fname[0])
 
    def b_create(self):
 
        b_create = QPushButton(self)
        b_create.setText("Добавить")
        b_create.setMinimumSize(10, 40)
 
        b_create.clicked.connect(self.create_button)
 
        return b_create
 
    def b_close(self):
        b_close = QPushButton(self)
        b_close.setText("Отмена")
        b_close.setMinimumSize(10, 40)
        b_close.clicked.connect(self._cancel)
 
        return b_close
 
    def _cancel(self):
        self.close()
 
    def showMessageBox(self, title, message):
        msgBox = QMessageBox()
        msgBox.setWindowTitle(title)
        msgBox.setText(message)
        msgBox.setStyleSheet("font: 12px;"
                             "font-family: Century Gothic;")
        msgBox.setStandardButtons(QMessageBox.Ok)
        msgBox.exec_()
 
    # Проверка ввода данных
    def create_button(self):
        if len(self._leReview.text()) == 0:
            self.showMessageBox('Внимание!',
                                '<center><br/><u style=font-size:10pt><FONT FACE="Arial"><b>Вы не заполнили поля</b></u></center></FONT>')
        else:
            self.main.create_new_button()
            self.main.saved_conf()
            self.close()
 
 
if __name__ == ('__main__'):
    w = Second()
    w.show()
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
04.10.2022, 21:30
Ответы с готовыми решениями:

Создание html файлов с последующим сохранением
Пожалуйста помогите. В форме будет кнопка и текстбокс при нажатии кнопки содержимое текстбокса должно сохраняться как html файл и что бы...

Как открыть файл Excel и изменить в нем информацию с последующим сохранением?
Мне нужно открыть на С# файл test.xls, внести в него изменения, сохранить и закрыть. Как создать новый и выполнить последующие действия я...

Запуск приложения от имени другого пользователя через BAT файл, с сохранением путей для Log & INI файлов
Запуск приложения от имени другого пользователя через BAT-файл, с сохранением путей для Log &amp; INI файлов. Проблема: На ПК имеется...

6
172 / 112 / 65
Регистрация: 26.06.2020
Сообщений: 334
05.10.2022, 21:28
Цитата Сообщение от DjonyCooper Посмотреть сообщение
могут запускать прикрепленный к ним exe файл, но только тот, что был прикреплен последним.
Сделать в классе словарь:
Python
1
self.dictButtons = {}
При создании новой кнопки, помещать в словарь её название, и путь к прикреплённому файлу:
Python
1
self.dictButtons[self.new_but.text()] = self.click_newprog._leReview.text()
Обработка клика по такой кнопке:
Python
1
2
3
4
5
def btnClicked(self):
        import os
        button = self.sender()
        #os.startfile(self.click_newprog._leReview.text())
        os.startfile(self.dictButtons[button.text()])
Добавлено через 33 минуты
Цитата Сообщение от DjonyCooper Посмотреть сообщение
Получается сохранить конфиг кнопки в файл settings.ini - но не могу извлечь данные при запуске программы.
У тебя только последняя останется, перепишет предыдущую (названия полей, для каждой записи, должны быть уникальными, у тебя - одинаковые).

Добавлено через 26 минут
Вариант:
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
def saved_conf(self):
        # Сохранение созданной кнопки в ini файл
        self.settings.beginGroup(self.new_but.text())
        self.settings.setValue('exe', self.dictButtons[self.new_but.text()])
        self.settings.endGroup()
        self.settings.sync()
 
def restore_settings(self):
    # Функция восстановления сохраненного конфига из ini файла
        for i in self.settings.allKeys():
            self.restore_buttons(i.split('/')[0], self.settings.value(i))
            
def restore_buttons(self, name, exe):
        self.new_but = QPushButton()
        self.new_but.setFixedSize(70, 70)
        self.new_but.clicked.connect(self.btnClicked)
        self.new_but.setText(name)
        self.grid_prog.addWidget(self.new_but, 0, 0)
        i = self.grid_prog.count() - 1
        self.grid_prog.addWidget(self.new_but, 1 + i // 8, i % 8)
        self.new_but.installEventFilter(self)
 
        self.dictButtons[name] = exe
1
 Аватар для DjonyCooper
10 / 7 / 4
Регистрация: 28.05.2021
Сообщений: 136
05.10.2022, 22:12  [ТС]
Цитата Сообщение от ll45 Посмотреть сообщение
Сделать в классе словарь:
PythonВыделить код
1
self.dictButtons = {}
При создании новой кнопки, помещать в словарь её название, и путь к прикреплённому файлу:
PythonВыделить код
1
self.dictButtons[self.new_but.text()] = self.click_newprog._leReview.text()
Обработка клика по такой кнопке:
PythonВыделить код
1
2
3
4
5
def btnClicked(self):
        import os
        button = self.sender()
        #os.startfile(self.click_newprog._leRevi ew.text())
        os.startfile(self.dictButtons[button.text()])
Не чего не поменялось, каждая новая кнопка, переписывает ту, что уже есть в словаре, выходит что запуск теперь работает только на последнюю кнопку:
0
 Аватар для DjonyCooper
10 / 7 / 4
Регистрация: 28.05.2021
Сообщений: 136
05.10.2022, 23:08  [ТС]
Цитата Сообщение от ll45 Посмотреть сообщение
Вариант:

def saved_conf(self):
        # Сохранение созданной кнопки в ini файл
        self.settings.beginGroup(self.new_but.te xt())
        self.settings.setValue('exe', self.dictButtons[self.new_but.text()])
        self.settings.endGroup()
        self.settings.sync()
def restore_settings(self):
    # Функция восстановления сохраненного конфига из ini файла
        for i in self.settings.allKeys():
            self.restore_buttons(i.split('/')[0], self.settings.value(i))
def restore_buttons(self, name, exe):
        self.new_but = QPushButton()
        self.new_but.setFixedSize(70, 70)
        self.new_but.clicked.connect(self.btnCli cked)
        self.new_but.setText(name)
        self.grid_prog.addWidget(self.new_but, 0, 0)
        i = self.grid_prog.count() - 1
        self.grid_prog.addWidget(self.new_but, 1 + i // 8, i % 8)
        self.new_but.installEventFilter(self)
self.dictButtons[name] = exe
Сохраняет параметр (имя и путь до кнопки), но к сожалению при запуске восстановления ранее созданных кнопок не происходит

Добавлено через 13 минут
Цитата Сообщение от ll45 Посмотреть сообщение
def restore_buttons(self, name, exe):
        self.new_but = QPushButton()
        self.new_but.setFixedSize(70, 70)
        self.new_but.clicked.connect(self.btnCli cked)
        self.new_but.setText(name)
        self.grid_prog.addWidget(self.new_but, 0, 0)
        i = self.grid_prog.count() - 1
        self.grid_prog.addWidget(self.new_but, 1 + i // 8, i % 8)
        self.new_but.installEventFilter(self)
self.dictButtons[name] = exe
после того как убрал из кода self.dictButtons[name] = exe эту строку сохранение кнопок и восстановление их при запуске заработало, но т.к. словарь не сохраняется, соответственно запускать кнопкам не чего может возможно при каждом создании кнопки, писать словарь в ini файл? а содержимое этого словаря брать как раз из ini файла? ll45, спасибо тебе за помощь!
0
172 / 112 / 65
Регистрация: 26.06.2020
Сообщений: 334
06.10.2022, 05:53
Лучший ответ Сообщение было отмечено DjonyCooper как решение

Решение

Ты какой-то свой код пробуешь, какой - мне не видно.
Цитата Сообщение от DjonyCooper Посмотреть сообщение
1. Динамически создавать кнопки, которые по сути будут ярлыками на внешние программы.
2. При необходимости, удалять нужную кнопку, чтобы остальные смещались согласно макету.
3. Сохранять конфигурацию в ini файл, чтобы после перезапуска все созданные кнопки сохранялись.
Перед запуском кода, не забудь удалить старый settings.ini.
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
from PyQt5.QtWidgets import QWidget, QApplication, QGridLayout, QGroupBox, QPushButton, QMessageBox, QMenu
from PyQt5.QtCore import QEvent, QSettings, Qt
from PyQt5.QtGui import QIcon
 
class Main(QWidget):
 
    
 
    def __init__(self):
        super(Main, self).__init__()
        self.setWindowTitle('Образец')
        self.resize(500, 300)
 
        grid = QGridLayout()
        grid.addWidget(self.prog_group_box(), 0, 0, 1, 1)
        grid.addWidget(self.b_new_prog(), 1, 0, Qt.AlignRight)
 
        self.setLayout(grid)
        
        self.settings = QSettings("settings.ini", QSettings.IniFormat)
        self.dictButtons = {}
    
    def prog_group_box(self):
        groupBox1 = QGroupBox(self)
        self.grid_prog = QGridLayout()
        groupBox1.setLayout(self.grid_prog)
 
        return groupBox1
 
    def saved_conf(self):
        # Сохранение созданной кнопки в ini файл
        self.settings.beginGroup(self.new_but.text())
        self.settings.setValue('exe', self.dictButtons[self.new_but.text()])
        self.settings.endGroup()
        self.settings.sync()
    
    
    def restore_settings(self):
    # Функция восстановления сохраненного конфига из ini файла
        for i in self.settings.allKeys():
            self.restore_buttons(i.split('/')[0], self.settings.value(i))
            
    def restore_buttons(self, name, exe):
        self.new_but = QPushButton()
        self.new_but.setFixedSize(70, 70)
        self.new_but.clicked.connect(self.btnClicked)
        self.new_but.setText(name)
        self.grid_prog.addWidget(self.new_but, 0, 0)
        i = self.grid_prog.count() - 1
        self.grid_prog.addWidget(self.new_but, 1 + i // 8, i % 8)
        self.new_but.installEventFilter(self)
 
        self.dictButtons[name] = exe  
        
 
    def delete_setting(self, button):
        # Функция удаления данных из ini файла с сохраненной конфигурацией
        del self.dictButtons[button.text()]
        self.settings.remove(button.text())
 
    def b_new_prog(self):
        self.b_new_prog = QPushButton(self)
        self.b_new_prog.setText("Добавить")
        self.b_new_prog.setMinimumSize(129, 43)
        self.b_new_prog.clicked.connect(self.click_newprog)
 
        return self.b_new_prog
 
    def click_newprog(self):
        from second import Second
        self.click_newprog = Second(self)
        self.click_newprog.show()
 
    def create_new_button(self):
        self.new_but = QPushButton()
        self.new_but.setFixedSize(70, 70)
        self.new_but.clicked.connect(self.btnClicked)
        self.new_but.setText(self.click_newprog._leProgLabel.text())
        self.grid_prog.addWidget(self.new_but, 0, 0)
        i = self.grid_prog.count() - 1
        self.grid_prog.addWidget(self.new_but, 1 + i // 8, i % 8)
        self.new_but.installEventFilter(self)
 
        self.dictButtons[self.new_but.text()] = self.click_newprog._leReview.text()
 
    def btnClicked(self):
        import os
        button = self.sender()
        os.startfile(self.dictButtons[button.text()])
    
    # Контекстное меню
    def eventFilter(self, source, event):
        button = source
        if event.type() == QEvent.ContextMenu:
            menu = QMenu()
            menu.addAction('Удалить')
 
            if menu.exec_(event.globalPos()):
                reply = QMessageBox.question(
                    self,
                    'Message', "Вы действительно хотите удалить?",
                    QMessageBox.Yes | QMessageBox.No,
                    QMessageBox.No
                    )
                if reply == QMessageBox.Yes:
                    
                    button.hide()
                    self.delete_setting(button)
                else:
                    pass
 
        return super().eventFilter(source, event)
 
if __name__ == ('__main__'):
    import sys
    app = QApplication(sys.argv)
    w = Main()
    w.show()
    w.restore_settings()
    sys.exit(app.exec_())
1
 Аватар для DjonyCooper
10 / 7 / 4
Регистрация: 28.05.2021
Сообщений: 136
06.10.2022, 11:24  [ТС]
Цитата Сообщение от ll45 Посмотреть сообщение
Перед запуском кода, не забудь удалить старый settings.ini.
from PyQt5.QtWidgets import QWidget, QApplication, QGridLayout, QGroupBox, QPushButton, QMessageBox, QMenu
from PyQt5.QtCore import QEvent, QSettings, Qt
from PyQt5.QtGui import QIcon
class Main(QWidget):
def __init__(self):
        super(Main, self).__init__()
        self.setWindowTitle('Образец')
        self.resize(500, 300)
grid = QGridLayout()
        grid.addWidget(self.prog_group_box(), 0, 0, 1, 1)
        grid.addWidget(self.b_new_prog(), 1, 0, Qt.AlignRight)
self.setLayout(grid)
self.settings = QSettings("settings.ini", QSettings.IniFormat)
        self.dictButtons = {}
def prog_group_box(self):
        groupBox1 = QGroupBox(self)
        self.grid_prog = QGridLayout()
        groupBox1.setLayout(self.grid_prog)
return groupBox1
def saved_conf(self):
        # Сохранение созданной кнопки в ini файл
        self.settings.beginGroup(self.new_but.te xt())
        self.settings.setValue('exe', self.dictButtons[self.new_but.text()])
        self.settings.endGroup()
        self.settings.sync()
def restore_settings(self):
    # Функция восстановления сохраненного конфига из ini файла
        for i in self.settings.allKeys():
            self.restore_buttons(i.split('/')[0], self.settings.value(i))
def restore_buttons(self, name, exe):
        self.new_but = QPushButton()
        self.new_but.setFixedSize(70, 70)
        self.new_but.clicked.connect(self.btnCli cked)
        self.new_but.setText(name)
        self.grid_prog.addWidget(self.new_but, 0, 0)
        i = self.grid_prog.count() - 1
        self.grid_prog.addWidget(self.new_but, 1 + i // 8, i % 8)
        self.new_but.installEventFilter(self)
self.dictButtons[name] = exe  
def delete_setting(self, button):
        # Функция удаления данных из ini файла с сохраненной конфигурацией
        del self.dictButtons[button.text()]
        self.settings.remove(button.text())
def b_new_prog(self):
        self.b_new_prog = QPushButton(self)
        self.b_new_prog.setText("Добавить")
        self.b_new_prog.setMinimumSize(129, 43)
        self.b_new_prog.clicked.connect(self.cli ck_newprog)
return self.b_new_prog
def click_newprog(self):
        from second import Second
        self.click_newprog = Second(self)
        self.click_newprog.show()
def create_new_button(self):
        self.new_but = QPushButton()
        self.new_but.setFixedSize(70, 70)
        self.new_but.clicked.connect(self.btnCli cked)
        self.new_but.setText(self.click_newprog. _leProgLabel.text())
        self.grid_prog.addWidget(self.new_but, 0, 0)
        i = self.grid_prog.count() - 1
        self.grid_prog.addWidget(self.new_but, 1 + i // 8, i % 8)
        self.new_but.installEventFilter(self)
self.dictButtons[self.new_but.text()] = self.click_newprog._leReview.text()
def btnClicked(self):
        import os
        button = self.sender()
        os.startfile(self.dictButtons[button.text()])
# Контекстное меню
    def eventFilter(self, source, event):
        button = source
        if event.type() == QEvent.ContextMenu:
            menu = QMenu()
            menu.addAction('Удалить')
if menu.exec_(event.globalPos()):
                reply = QMessageBox.question(
                    self,
                    'Message', "Вы действительно хотите удалить?",
                    QMessageBox.Yes | QMessageBox.No,
                    QMessageBox.No
                    )
                if reply == QMessageBox.Yes:
button.hide()
                    self.delete_setting(button)
                else:
                    pass
return super().eventFilter(source, event)
if __name__ == ('__main__'):
    import sys
    app = QApplication(sys.argv)
    w = Main()
    w.show()
    w.restore_settings()
    sys.exit(app.exec_())
Последний раз редактировалось ll45; Сегодня в 05:56.
Спасибо это то что нужно, еще можно вопрос? А если например я буду передавать в кнопку не только путь до нужного exe файла, но например - иконку, т.е. добавить ее и сохранить в файл я понял как, но получается, в файле settings.ini мы получим что то вроде
[Notepad]
exe=C:/Windows/notepad.exe
img=какой то путь до png изображения

Тогда если я правильно понимаю код, все переменные заключенные в сохраненный список, будут реализовываться как кнопки при запуске, т.е. появится кнопка открывающая по выше представленному примеру блокнот и вторая кнопка с тем же называнием будет открывать ту картинку которая заключена в переменную img.

Как то их возможно разделить?т.е. чтобы создавался объект исходя не из всех ключей а только из конкретного, а другие ключи использовались например для картинки?
0
172 / 112 / 65
Регистрация: 26.06.2020
Сообщений: 334
06.10.2022, 18:03
Цитата Сообщение от DjonyCooper Посмотреть сообщение
Как то их возможно разделить?т.е. чтобы создавался объект исходя не из всех ключей а только из конкретного, а другие ключи использовались например для картинки?
Возможно, было бы желание...
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
06.10.2022, 18:03
Помогаю со студенческими работами здесь

QPushButton динамическое изменение размера
Доброго времени суток. Столкнулся с проблемой. Есть множество Кнопок наследуемых от QPushButton. Все они лежат в QGridLayout. Нужно что бы...

Сортировка таблицы с последующим сохранением
Добрый день, У меня возникла проблема с сохранением сортировки в таблицу. Мне надо что бы таблица отсортировалась, потом в...

Динамический массив с последующим сохранением содержимого
Доброго времени суток. При изучении столкнулся с такой проблемой. То есть добавление элементов в массив. проблема не в добавлении, а вот...

Удаление строки из БД access c последующим сохранением БД
приветствую читающих, возникли неполадки прошу помощи господа программисты) есть прога с множеством форм в одной из форм есть датагрид,...

Проблемы с сохранением и последующим использованием переменных
У меня на форме 1 есть трехмерный массив, мне нужно что бы при выходе, данные массива сохранялись и при следующим запуске использовались...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
Очистка реквизитов документа при копировании
Maks 09.04.2026
Алгоритм из решения ниже применим как для типовых, так и для нетиповых документов на самых различных конфигурациях. Задача: при копировании документа очищать определенные реквизиты и табличную. . .
модель ЗдравоСохранения 8. Подготовка к разному выполнению заданий
anaschu 08.04.2026
https:/ / github. com/ shumilovas/ med2. git main ветка * содержимое блока дэлэй из старой модели теперь внутри зайца новой модели 8ATzM_2aurI
Блокировка документа от изменений, если он открыт у другого пользователя
Maks 08.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в конфигурации КА2. Задача: запретить редактирование документа, если он открыт у другого пользователя. / / . . .
Система безопасности+живучести для сервера-слоя интернета (сети). Двойная привязка.
Hrethgir 08.04.2026
Далее были размышления о системе безопасности. Сообщения с наклонным текстом - мои. А как нам будет можно проверить, что ссылка наша, а не подделана хулиганами, которая выбросит на другую ветку и. . .
Модель ЗдрввоСохранения 7: больше работников, больше ресурсов.
anaschu 08.04.2026
работников и заданий может быть сколько угодно, но настроено всё так, что используется пока что только 20% kYBz3eJf3jQ
Дальние перспективы сервера - слоя сети с космологическим дизайном интефейса карты и логики.
Hrethgir 07.04.2026
Дальнейшее ближайшее планирование вывело к размышлениям над дальними перспективами. И вот тут может быть даже будут нужны оценки специалистов, так как в дальних перспективах всё может очень сильно. . .
Горе от ума
kumehtar 07.04.2026
Эта мне ментальная установка, что вот прямо сейчас, мол, мне для полного счастья не хватает (нужное вписать), и когда я этого достигну - тогда и полный кайф. Одна из самых сильных ловушек на пути. . . .
Использование значений реквизитов справочника в документе, с определенными условиями и правами
Maks 07.04.2026
1. Контроль срока действия договора Алгоритм из решения ниже реализован на примере нетипового документа "ЗаявкаНаРаботу", разработанного в конфигурации КА2. Задача: уведомлять пользователя, если. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru