Форум программистов, компьютерный форум, киберфорум
iamvic
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
Путевые заметки в процессе познания Python и PyQt/PySide.
Помни - только тег CODE не портит код добавлением пробела в начало пустой строки.

К вопросу о построении дерева родительских отношений в PyQt (часть 7)

Запись от iamvic размещена 23.10.2024 в 16:14
Показов 1042 Комментарии 0
Метки pyqt5, python, python 3

Ещё со времён написания заметки К вопросу о построении дерева родительских отношений в PyQt (часть 2) меня не покидала мысль, что было бы весьма неплохо сделать некую демонстрационную программку, которая по задаваемым пользователем параметрам:

- создавала бы требуемый модальный диалог на базе одного из стандартных диалогов,
- запускала бы его на выполнение,
- и отображала бы в окне просмотра дерево родительских отношений, сгенерированное именно для этого экземпляра диалога.

И вот мечты сбываются

Нажмите на изображение для увеличения
Название: stddlg_slideL.jpg
Просмотров: 219
Размер:	22.8 Кб
ID:	9005

Предупреждаю - код сырой, поражает своей архаичностью, брутальностью и прочими недостатками, но рабочий.

Хотя, конечно, есть вопрос, решить который не удастся принципиально. До стандартных диалогов, построенных в окне верхнего уровня с помощью вызова любой функции (static public members), достучаться не удастся в любом случае. Там просто не за что зацепиться, чтобы получить идентификатор экземпляра класса, который упрятан внутри вызова.

Ну, а второй недостаток проявился во время тестирования - если торопливый пользователь закрывает открывшийся стандартный диалог раньше, чем через 2 секунды, то срабатывает исключение RuntimeError. Обработчик исключения пока не реализован, потерпите...

Состав пакета (4 файла):

stddlg_slide.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
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
#!/usr/bin/python3
# -*- coding: utf-8 -*-
#
# StdDlg Slide Show v0.01L
import os, sys
import tree_builder
import screen_tools
from global_kit import (
    Pseudo_global_vars as ps_vars)
from PyQt5 import QtCore, QtGui, QtWidgets
 
APP_NAME = 'StdDlg Slide Show v0.01'
MY_STYLE_SHEET = (
    'QPlainTextEdit {'
    'font-family: courier; '
    'font: bold; '
    'color: darkolivegreen; '
    'background-color: lightgoldenrodyellow; '
    '}\n'
    )
 
def add_blank(v):
    v.addTab(QtWidgets.QPlainTextEdit(), 'Blank')
    z = v.widget(v.count() - 1)
    z.setWordWrapMode(QtGui.QTextOption.NoWrap)
    z.setReadOnly(True)
 
def create_slide(v, t='text', h = 'Slide'):
    z = v.widget(v.count() - 1)
    z.setPlainText(t)
    v.setTabText(v.count() - 1, h)
    v.setCurrentIndex(v.count() - 1)
    add_blank(v)
 
def find_checked(w):
    z = list()
    for x in w.findChildren(QtWidgets.QRadioButton):
        if x.isChecked():
            z.append(x.objectName())
    return z
 
def find_parent(w, c):
    z = w.findChild(c)
    if not ps_vars.contains('z_parent'):
        ps_vars.set('z_parent', z)
 
def get_parent():
    z = None
    if ps_vars.contains('z_parent'):
       z = ps_vars.drop('z_parent')
    return z
 
class Main_window(QtWidgets.QMainWindow):
    def __init__(self, parent=None,  point_pos=QtCore.QPoint(0, 0)):
        super(Main_window, self).__init__(parent)
        wdt_central = QtWidgets.QWidget()
        map_main = QtWidgets.QHBoxLayout()
        wdt_tab = QtWidgets.QTabWidget()
        wdt_control = Control_widget()
 
        wdt_central.setObjectName('wdt_central')
        map_main.setObjectName('map_main')
        wdt_tab.setObjectName('wdt_tab')
        wdt_control.setObjectName('wdt_control')
 
        add_blank(wdt_tab)
 
        map_main.addWidget(wdt_control)
        map_main.addWidget(wdt_tab)
        wdt_central.setLayout(map_main)
        self.setCentralWidget(wdt_central)
 
        screen_tools.set_mainwindow_geometry(
            self, screen_tools.get_screen_geo_by_pos(point_pos))
 
class Control_widget(QtWidgets.QWidget):
    def __init__(self, parent=None):
        super(Control_widget, self).__init__(parent)
        cw_layout = QtWidgets.QVBoxLayout()
        vl_basis = QtWidgets.QVBoxLayout()
        vl_target = QtWidgets.QVBoxLayout()
        vl_subject = QtWidgets.QVBoxLayout()
        vl_dialog = QtWidgets.QVBoxLayout()
        gb_basis = QtWidgets.QGroupBox('Basis')
        gb_target = QtWidgets.QGroupBox('Target')
        gb_subject = QtWidgets.QGroupBox('Subject')
        gb_dialog = QtWidgets.QGroupBox('Dialog')
        rb_widget = QtWidgets.QRadioButton('create window')
        rb_function = QtWidgets.QRadioButton('call function')
        rb_file = QtWidgets.QRadioButton('QFileDialog')
        rb_font = QtWidgets.QRadioButton('QFontDialog')
        rb_color = QtWidgets.QRadioButton('QColorDialog')
        rb_input = QtWidgets.QRadioButton('QInputDialog')
        rb_message = QtWidgets.QRadioButton('QMessageBox')
        rb_subwindow = QtWidgets.QRadioButton('sub-window with parent')
        rb_toplevel = QtWidgets.QRadioButton('toplevel window')
        rb_qtbased = QtWidgets.QRadioButton('Qt-based dialog')
        rb_native = QtWidgets.QRadioButton('system native dialog')
        pb_show = QtWidgets.QPushButton('Call dialog and add slide')
 
        cw_layout.setObjectName('cw_layout')
        vl_basis.setObjectName('vl_basis')
        vl_target.setObjectName('vl_target')
        vl_subject.setObjectName('vl_subject')
        vl_dialog.setObjectName('vl_dialog')
        gb_basis.setObjectName('gb_basis')
        gb_target.setObjectName('gb_target')
        gb_subject.setObjectName('gb_subject')
        gb_dialog.setObjectName('gb_dialog')
        rb_widget.setObjectName('rb_widget')
        rb_function.setObjectName('rb_function')
        rb_file.setObjectName('rb_file')
        rb_font.setObjectName('rb_font')
        rb_color.setObjectName('rb_color')
        rb_input.setObjectName('rb_input')
        rb_message.setObjectName('rb_message')
        rb_subwindow.setObjectName('rb_subwindow')
        rb_toplevel.setObjectName('rb_toplevel')
        rb_qtbased.setObjectName('rb_qtbased')
        rb_native.setObjectName('rb_native')
        pb_show.setObjectName('pb_show')
 
        rb_widget.setChecked(True)
        rb_file.setChecked(True)
        rb_subwindow.setChecked(True)
        rb_qtbased.setChecked(True)
 
        vl_basis.addWidget(rb_widget)
        vl_basis.addWidget(rb_function)
        vl_target.addWidget(rb_file)
        vl_target.addWidget(rb_font)
        vl_target.addWidget(rb_color)
        vl_target.addWidget(rb_input)
        vl_target.addWidget(rb_message)
        vl_subject.addWidget(rb_subwindow)
        vl_subject.addWidget(rb_toplevel)
        vl_dialog.addWidget(rb_qtbased)
        vl_dialog.addWidget(rb_native)
        gb_basis.setLayout(vl_basis)
        gb_target.setLayout(vl_target)
        gb_subject.setLayout(vl_subject)
        gb_dialog.setLayout(vl_dialog)
        cw_layout.addWidget(gb_basis)
        cw_layout.addWidget(gb_target)
        cw_layout.addWidget(gb_subject)
        cw_layout.addWidget(gb_dialog)
        cw_layout.addStretch(1)
        cw_layout.addWidget(pb_show)
        self.setLayout(cw_layout)
        QtCore.QMetaObject.connectSlotsByName(self)
 
    def on_pb_show_pressed(self):
        x = self.sender()
        x.setDisabled(True)
        lx = find_checked(self)
        x_parent = self if lx[2] == 'rb_subwindow' else None
        x_notnative = lx[3] != 'rb_native'
        x_legacy = True
 
        if lx[0] == 'rb_widget':
            if lx[1] == 'rb_file':
                wdlg = QtWidgets.QFileDialog(x_parent)
                wdlg.setOption(
                    QtWidgets.QFileDialog.DontUseNativeDialog, x_notnative)
            elif lx[1] == 'rb_font':
                wdlg = QtWidgets.QFontDialog(x_parent)
                wdlg.setOption(
                    QtWidgets.QFontDialog.DontUseNativeDialog, x_notnative)
            elif lx[1] == 'rb_color':
                wdlg = QtWidgets.QColorDialog(x_parent)
                wdlg.setOption(
                    QtWidgets.QColorDialog.DontUseNativeDialog, x_notnative)
            elif lx[1] == 'rb_input':
                wdlg = QtWidgets.QInputDialog(x_parent)
                wdlg.setTextValue('Here is your text')
            elif lx[1] == 'rb_message':
                wdlg = QtWidgets.QMessageBox(x_parent)
                wdlg.setText('Something happened?')
                wdlg.setStandardButtons(
                    QtWidgets.QMessageBox.Yes |
                    QtWidgets.QMessageBox.YesToAll |
                    QtWidgets.QMessageBox.No |
                    QtWidgets.QMessageBox.NoToAll |
                    QtWidgets.QMessageBox.Open |
                    QtWidgets.QMessageBox.Close)
        elif lx[0] == 'rb_function':
            if lx[1] == 'rb_file':
                QtCore.QTimer.singleShot(
                    500,
                    lambda: find_parent(self, QtWidgets.QFileDialog))
                QtCore.QTimer.singleShot(
                    1000,
                    lambda: tree_builder.prepare_tree(
                        get_parent(), len(sys.argv) > 1))
                QtCore.QTimer.singleShot(
                    1500,
                    lambda: self.after_pb_show_pressed())
                QtCore.QTimer.singleShot(
                    2000,
                    lambda: x.setDisabled(False))
                if x_notnative:
                    fname = QtWidgets.QFileDialog.getOpenFileName(
                        self,
                        'Select file',
                        os.curdir,
                        'Python scripts (*.py)',
                        options = QtWidgets.QFileDialog.DontUseNativeDialog)
                else:
                    fname = QtWidgets.QFileDialog.getOpenFileName(
                        self,
                        'Select file',
                        os.curdir,
                        'Python scripts (*.py)')
            elif lx[1] == 'rb_font':
                QtCore.QTimer.singleShot(
                    500,
                    lambda: find_parent(self, QtWidgets.QFontDialog))
                QtCore.QTimer.singleShot(
                    1000,
                    lambda: tree_builder.prepare_tree(
                        get_parent(), len(sys.argv) > 1))
                QtCore.QTimer.singleShot(
                    1500,
                    lambda: self.after_pb_show_pressed())
                QtCore.QTimer.singleShot(
                    2000,
                    lambda: x.setDisabled(False))
                if x_notnative:
                    (newfont,ok) = QtWidgets.QFontDialog.getFont(
                        QtWidgets.QApplication.font(),
                        self,
                        'Select font',
                        options = QtWidgets.QFontDialog.DontUseNativeDialog)
                else:
                    (newfont,ok) = QtWidgets.QFontDialog.getFont(
                        QtWidgets.QApplication.font(),
                        self,
                        'Select font')
            elif lx[1] == 'rb_color':
                QtCore.QTimer.singleShot(
                    500,
                    lambda: find_parent(self, QtWidgets.QColorDialog))
                QtCore.QTimer.singleShot(
                    1000,
                    lambda: tree_builder.prepare_tree(
                        get_parent(), len(sys.argv) > 1))
                QtCore.QTimer.singleShot(
                    1500,
                    lambda: self.after_pb_show_pressed())
                QtCore.QTimer.singleShot(
                    2000,
                    lambda: x.setDisabled(False))
                if x_notnative:
                    color = QtWidgets.QColorDialog.getColor(
                        QtCore.Qt.white,
                        self,
                        'Select color',
                        options = QtWidgets.QColorDialog.DontUseNativeDialog)
                else:
                    color = QtWidgets.QColorDialog.getColor(
                        QtCore.Qt.white,
                        self,
                        'Select color')
            elif lx[1] == 'rb_input':
                QtCore.QTimer.singleShot(
                    500,
                    lambda: find_parent(self, QtWidgets.QInputDialog))
                QtCore.QTimer.singleShot(
                    1000,
                    lambda: tree_builder.prepare_tree(
                        get_parent(), len(sys.argv) > 1))
                QtCore.QTimer.singleShot(
                    1500,
                    lambda: self.after_pb_show_pressed())
                QtCore.QTimer.singleShot(
                    2000,
                    lambda: x.setDisabled(False))
                text = QtWidgets.QInputDialog.getText(
                    self, 'Here is your text', 'Text')
            elif lx[1] == 'rb_message':
                QtCore.QTimer.singleShot(
                    500,
                    lambda: find_parent(self, QtWidgets.QMessageBox))
                QtCore.QTimer.singleShot(
                    1000,
                    lambda: tree_builder.prepare_tree(
                        get_parent(), len(sys.argv) > 1))
                QtCore.QTimer.singleShot(
                    1500,
                    lambda: self.after_pb_show_pressed())
                QtCore.QTimer.singleShot(
                    2000,
                    lambda: x.setDisabled(False))
                text = QtWidgets.QMessageBox.question(
                    self, 'Answer, please', 'Something happened?',
                    buttons =  QtWidgets.QMessageBox.Yes |
                        QtWidgets.QMessageBox.YesToAll |
                        QtWidgets.QMessageBox.No |
                        QtWidgets.QMessageBox.NoToAll |
                        QtWidgets.QMessageBox.Open |
                        QtWidgets.QMessageBox.Close)
        else:
            x_legacy = False
 
        if x_legacy and lx[0] == 'rb_widget':
            QtCore.QTimer.singleShot(
                1000,
                lambda: tree_builder.prepare_tree(wdlg, len(sys.argv) > 1))
            QtCore.QTimer.singleShot(
                1500,
                lambda: self.after_pb_show_pressed())
            QtCore.QTimer.singleShot(
                2000,
                lambda: x.setDisabled(False))
            wdlg.exec()
            wdlg.deleteLater()
        elif x_legacy and lx[0] == 'rb_function':
            pass
        else:
            x.setDisabled(False)
 
    def after_pb_show_pressed(self):
        dx_list = []
        if ps_vars.contains('z_details'):
            dx_list = ps_vars.drop('z_details')
        tx_list = ['']
        if ps_vars.contains('z_itog'):
            tx_list = ps_vars.drop('z_itog')
        tx = '\n'.join(dx_list + [''] + tx_list)
        x = self.parent().findChild(QtWidgets.QTabWidget, 'wdt_tab')
        create_slide(x, tx, 'Slide_{!s}'.format(x.count()))
 
    @QtCore.pyqtSlot(name = 'on_rb_widget_pressed')
    @QtCore.pyqtSlot(name = 'on_rb_function_pressed')
    def on_basis_pressed(self):
        lx = ['rb_file', 'rb_font', 'rb_color',
              'rb_input', 'rb_message']
        lf = ['.getOpenFileName()', '.getColor()', '.getFont()',
              '.getText()', '.question()']
        lz = ['rb_subwindow', 'rb_toplevel']
        for i in range(len(lx)):
            y = self.findChild(QtWidgets.QRadioButton, lx[i])
            if self.sender().objectName() == 'rb_widget':
                if y.text().find('.') > -1:
                    y.setText(y.text()[0:y.text().find('.')])
            else:
                if y.text().find('.') == -1:
                    y.setText(y.text() + lf[i])
        if self.sender().objectName() == 'rb_function':
            z0 = self.findChild(QtWidgets.QRadioButton, lz[0])
            z0.setChecked(True)
            z1 = self.findChild(QtWidgets.QRadioButton, lz[1])
            z1.setDisabled(True)
        else:
            z1 = self.findChild(QtWidgets.QRadioButton, lz[1])
            z1.setDisabled(False)
 
    @QtCore.pyqtSlot(name = 'on_rb_file_pressed')
    @QtCore.pyqtSlot(name = 'on_rb_font_pressed')
    @QtCore.pyqtSlot(name = 'on_rb_color_pressed')
    @QtCore.pyqtSlot(name = 'on_rb_input_pressed')
    @QtCore.pyqtSlot(name = 'on_rb_message_pressed')
    def on_target_pressed(self):
        lx = ['rb_file', 'rb_font', 'rb_color']
        ly = ['rb_input', 'rb_message']
        lz = ['rb_qtbased', 'rb_native']
        if self.sender().objectName() in lx:
            z1 = self.findChild(QtWidgets.QRadioButton, lz[1])
            z1.setDisabled(False)
        elif self.sender().objectName() in ly:
            z0 = self.findChild(QtWidgets.QRadioButton, lz[0])
            z0.setChecked(True)
            z1 = self.findChild(QtWidgets.QRadioButton, lz[1])
            z1.setDisabled(True)
 
if __name__ == '__main__':
    app = QtWidgets.QApplication(sys.argv)
    app.setStyleSheet(MY_STYLE_SHEET)
    mwin = Main_window(point_pos = QtGui.QCursor.pos())
    mwin.setWindowTitle(APP_NAME)
    mwin.show()
    sys.exit(app.exec())


screen_tools.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
#!/usr/bin/python3
# -*- coding: utf-8 -*-
#
# Screen Tools v0.01
 
from PyQt5 import QtCore, QtWidgets
 
def get_screen_geo_by_pos(point_pos = QtCore.QPoint(0, 0)):
    screens = QtWidgets.QApplication.instance().screens()
    selected_screen = screens[
        QtWidgets.QApplication.desktop().primaryScreen()
        ]
    if len(screens) > 1:
        for i in range(len(screens)):
            if screens[i].geometry().contains(point_pos):
                selected_screen = screens[i]
                break
    return selected_screen.availableGeometry()
 
def set_mainwindow_geometry(client, screen_geo):
    client.move(screen_geo.x(), screen_geo.y())
    client.resize(screen_geo.width() // 2,
                  screen_geo.height() // 2)
    QtCore.QTimer.singleShot(
        100, lambda: move_to_center(client, screen_geo))
 
def move_to_center(client, screen_geo):
    client.move(screen_geo.topLeft() +
                screen_geo.center() -
                client.geometry().center())


tree_builder.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
112
113
114
115
116
117
118
119
120
121
#!/usr/bin/python3
# -*- coding: utf-8 -*-
#
# Tree Builder (variant TreeShow) v0.04
import sys
from global_kit import (
    Pseudo_global_vars as ps_vars)
from PyQt5 import QtCore
 
class Pseudo_gist(object):
   prev_class = 'QFileDialog'
   oper_class = 'QFileSystemModel'
   oper_prev = None
   with_details = False
 
def los2mat(x):
    '''los2mat(x) - convert x (as list of strings) to matrix'''
    l_max = 0
    for item in x:
        l_max = len(item) if l_max < len(item) else l_max
    result = list()
    for item in x:
        result.append([oneChar for oneChar in item])
    for ix in result:
        l_ix = len(ix)
        if l_max > l_ix:
            for t in range(l_max - l_ix):
                ix.append('')
    return result
 
def make_root(x):
    if x.metaObject().className() == Pseudo_gist.prev_class:
        Pseudo_gist.oper_prev = x
    if x.metaObject().className() == Pseudo_gist.oper_class:
        z = Pseudo_gist.oper_prev
    else:
        z = x.parent()
    a = '{!s} {!s}({!s})'.format(
            'None' if z is None else hex(id(z)),
            '*' if z is None else
                '*' if len(z.objectName()) < 1 else z.objectName(),
            'NoneType' if z is None else z.metaObject().className())
    b = '{!s} {!s}({!s})'.format(
            hex(id(x)),
            '*' if len(x.objectName()) < 1 else x.objectName(),
            x.metaObject().className())
    c = '{!s} ==> {!s}'.format(a, b)
    if Pseudo_gist.with_details:
        if not ps_vars.contains('z_details'):
            ps_vars.set('z_details', [''])
        dt_list = ps_vars.get('z_details')
        dt_list.append(c)
        ps_vars.set('z_details', dt_list)
    return(c)
 
def make_tree(x, c=''):
    t = list()
    t.append(c)
    for i in x.findChildren(QtCore.QObject):
        x = make_root(i)
        t.append(x)
    return(t)
 
def build_tree(wdt):
    c = make_root(wdt)
    z = list()
    z.append(c.split(' ')[0])
    z_list = list()
    z_list.append(c.split(' ')[1])
    max_zli = len(z_list[0])
    rc = make_tree(wdt, c)
    for i in rc:
        z_idx = -1
        try:
            z_idx = z.index(i.split(' ')[0])
        except:
            z.append(i.split(' ')[0])
        else:
            if z_idx > -1:
                for z_i in range(len(z) - z_idx - 1):
                    z_item = z.pop()
            z.append(i.split(' ')[3])
            zli_new = '{!s}{!s}{!s}'.format(
                ''.rjust(5 * (len(z) - 2)),
                '+==> ',
                i.split(' ')[4]
                )
            max_zli = len(zli_new) if len(
                zli_new) > max_zli else max_zli
            z_list.append(zli_new)
    z_list.reverse()
    z_prep = los2mat(z_list)
    z_tran = [[z_prep[j][i] for j in range(len(z_prep))]
                for i in range(len(z_prep[0]))]
    i_alfa = -1
    for z_tran_i in z_tran:
        i_alfa += 1
        is_plus = False
        i_beta = -1
        for z_tran_j in z_tran_i:
            i_beta += 1
            if z_tran_j == '+':
                is_plus = True
            elif z_tran_j != ' ':
                is_plus = False
            elif is_plus and z_tran_j == ' ':
                z_tran[i_alfa][i_beta] = '|'
    z_retr = [[z_tran[j][i] for j in range(len(z_tran))]
                for i in range(len(z_tran[0]))]
    z_itog = list()
    for z_retr_i in z_retr:
        s_ix = ''
        for z_retr_ix in z_retr_i:
            s_ix += z_retr_ix
        z_itog.append(s_ix)
    z_itog.reverse()
    ps_vars.set('z_itog', z_itog)
 
def prepare_tree(wdt, is_full_report=False):
    Pseudo_gist.with_details = is_full_report
    build_tree(wdt)


global_kit.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
#!/usr/bin/python3
# -*- coding: utf-8 -*-
"""DUICK (Data User Interface Collector Kit)
"""
 
class Pseudo_global_vars(object):
    """Реализация глобальных переменных с доступом по псевдонимам.
    """
    ___vars = {}
 
    def set(pseudo: str, value) -> bool:
        """Переменной с псевдонимом pseudo присваивается значение value.
        Если переменная с указанным псевдонимом отсутствует, то она создаётся.
        Возвращает True, если значение присвоено вновь созданой или
        существующей переменной, иначе - False.
        """
        if (type(pseudo) is str):
            Pseudo_global_vars.___vars[pseudo] = value
        return (type(pseudo) is str)
 
    def get(pseudo: str):
        """Возвращает значение, ранее присвоенное переменной с псевдонимом pseudo.
        Если переменная с указанным псевдонимом отсутствует, то возвращает None.
        """
        if (type(pseudo) is str) and Pseudo_global_vars.contains(pseudo):
            return Pseudo_global_vars.___vars[pseudo]
        else:
            return None
 
    def drop(pseudo: str):
        """Удаляет переменную с псевдонимом pseudo и возвращает её значение.
        Если переменная с указанным псевдонимом отсутствует, то возвращает None.
        """
        if (type(pseudo) is str) and Pseudo_global_vars.contains(pseudo):
            return Pseudo_global_vars.___vars.pop(pseudo)
        else:
            return None
 
    def contains(pseudo: str) -> bool:
        """Возвращает True, если переменная с псевдонимом pseudo существует,
        иначе - False.
        """
        return pseudo in Pseudo_global_vars.names()
 
    def names() -> list:
        """Возвращает список псевдонимов существующих переменных.
        """
        return list(Pseudo_global_vars.___vars.keys())


Испытательную программу stddlg_slide.py можно запускать в двух режимах:
- штатный режим (дополнительный параметр отсутствует):

Bash
1
c:\qtprobe\stddlg_slide>py stddlg_slide.py
- расширенный режим (присутствует какой-нибудь дополнительный параметр, например, 1):

Bash
1
c:\qtprobe\stddlg_slide>py stddlg_slide.py 1
В расширенным режиме слайд-шоу отображает не только дерево, но и исходный список пар родительских отношений.
Метки pyqt5, python, python 3
Размещено в Памятка
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Всего комментариев 0
Комментарии
 
Новые блоги и статьи
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
Фото: Daniel Greenwood
kumehtar 13.11.2025
Расскажи мне о Мире, бродяга
kumehtar 12.11.2025
— Расскажи мне о Мире, бродяга, Ты же видел моря и метели. Как сменялись короны и стяги, Как эпохи стрелою летели. - Этот мир — это крылья и горы, Снег и пламя, любовь и тревоги, И бескрайние. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru