Форум программистов, компьютерный форум, киберфорум
iamvic
Войти
Регистрация
Восстановить пароль
Путевые заметки в процессе познания Python и PyQt/PySide.
Рейтинг: 1.00. Голосов: 1.

Иллюстрация к вопросу о доступе из Python к PostgreSQL.

Запись от iamvic размещена 15.12.2020 в 09:44

Налепил некую болванку, в качестве иллюстрации
https://www.cyberforum.ru/blog... g6868.html
По крайней мере, всё, о чём говорилось, приобрело хоть какой-то
законченный вид.

pgsql_probe.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
#!/usr/bin/python3
# -*- coding: utf-8 -*-
 
import sys, os, platform
from PyQt5.QtWidgets import QAction, QApplication, QDesktopWidget
from PyQt5.QtWidgets import QMainWindow, QMessageBox
from PyQt5.QtSql import QSqlDatabase
 
APP_NAME = 'The PostgreSQL Probe v0.001'
ROOT32_REGKEY = 'SOFTWARE\\Wow6432Node\\'
ROOT_REGKEY = 'SOFTWARE\\'
PGSQL_KEY = 'PostgreSQL Global Development Group\\PostgreSQL'
PGSQL_LOCATION = 'Location'
 
class ProbeMainWindow(QMainWindow):
    """Главное окно приложения
    """
    def __init__(self, parent=None):
        super(ProbeMainWindow, self).__init__(parent)
        self.initUI()
 
    def initUI(self):
        """Строим графический интерфейс
        """
        screen = QDesktopWidget().availableGeometry()
        self.setGeometry(
            int(screen.width()/4), int(screen.height()/4),
            int(screen.width()/2), int(screen.height()/2))
 
        self.setWindowTitle(APP_NAME)
        self.statusBar()
 
        exitAction = QAction(
            'Выход', self, shortcut='Ctrl+Q',
            statusTip='Завершить работу приложения',
            triggered=self.to_close, enabled=True)
 
        taskMenu = self.menuBar().addMenu('Файл')
        taskMenu.addAction(exitAction)
 
    def to_close(self):
        """Завершаем работу.
        """
        self.close()
 
 
if __name__ == '__main__':
 
    if sys.platform == 'win32':
        # определяемся с разрядностью для Windows
        _path = os.environ['PATH']
        if platform.machine() == 'x86':
            # Windows/32, Python/32 => PostgreSQL/32
            _key = ROOT_REGKEY
 
        elif sys.maxsize > 0x100000000:
            # Windows/64, Python/64 => PostgreSQL/64
            _key = ROOT_REGKEY
 
        else:
            # Windows/64, Python/32 => PostgreSQL/32
            _key = ROOT32_REGKEY
 
        # путь к PostgreSQL тащим из системного реестра Windows
        _location = ''
        import winreg
        try:
            with winreg.OpenKey(
                winreg.HKEY_LOCAL_MACHINE, _key + PGSQL_KEY) as reg_key:
 
                for i in range(16):
                    key_val = winreg.EnumValue(reg_key, i)
                    if key_val[0] == PGSQL_LOCATION:
                        _location = key_val[1]
                        break
        except:
            pass
 
        if len(_location) > 0:
            # добавляем пути в переменную окружения PATH
            os.environ['PATH'] = '{!s}\\bin;{!s}\\lib;{!s}'.format(
                _location, _location, _path)
 
    app = QApplication(sys.argv)
    db = QSqlDatabase.addDatabase('QPSQL')
    if not db.isValid():
        # PostgreSQL не установлен
        if sys.maxsize > 0x100000000:
            _bit = '(64bit)'
        else:
            _bit = '(32bit)'
        mbox = QMessageBox()
        mbox.setWindowTitle('О Ш И Б К А !!!')
        mbox.setIcon(QMessageBox.Critical)
        mbox.setText(
            'Запуск приложения невозможен.')
        mbox.setInformativeText(
            'Приложению, использующему Python {!s}, для работы'
            ' также требуется установленный PostgreSQL {!s}.'
            ' Закройте приложение, проверьте все ли пакеты'
            ' установлены, установите недостающие и повторите'
            ' запуск.'.format(_bit, _bit))
        mbox.addButton(QMessageBox.Close)
        mbox.show()
        sys.exit(app.exec_())
 
    mwin = ProbeMainWindow()
    mwin.show()
    sys.exit(app.exec_())
Размещено в Памятка
Показов 7526 Комментарии 12
Всего комментариев 12
Комментарии
  1. Старый комментарий
    Аватар для Avazart
    Есть специальный статический метод QMessageBox.critical()

    https://doc.qt.io/qt-5/qmessagebox.html#critical


    Python
    1
    
    int(screen.width()/4)
    На
    Python
    1
    
    screen.width()//4

    Python
    1
    
    int(screen.width()/2), int(screen.height()/2))
    Есть метод center() https://doc.qt.io/qt-5/qrect.html#center
    Запись от Avazart размещена 15.12.2020 в 14:33 Avazart на форуме
    Обновил(-а) Avazart 15.12.2020 в 14:37
  2. Старый комментарий
    Avazart, ну я ж всё ещё познаю питон и принимаю почти все ваши замечания,
    но вот применимость этого для данного конкретного случая:
    Цитата:
    Сообщение от Avazart Просмотреть комментарий
    Есть специальный статический метод QMessageBox.critical()
    я попрошу вас доказать.
    Запись от iamvic размещена 15.12.2020 в 17:03 iamvic вне форума
  3. Старый комментарий
    Аватар для Avazart
    Что доказать?
    Запись от Avazart размещена 15.12.2020 в 18:18 Avazart на форуме
  4. Старый комментарий
    Я ж пытался с этим методом сделать, но у меня ничего не вышло.
    Просто покажите, как бы вы это сделали.
    Запись от iamvic размещена 15.12.2020 в 18:24 iamvic вне форума
  5. Старый комментарий
    Аватар для Avazart
    Ну так я ссылку на доку дал.

    Python
    1
    
    QMessageBox.critical(mwin,'О Ш И Б К А !!!','Сообщение!')
    Запись от Avazart размещена 15.12.2020 в 18:45 Avazart на форуме
    Обновил(-а) Avazart 15.12.2020 в 18:50
  6. Старый комментарий
    Ну, я оттуда знания и черпаю и этот метод широко применяю в своих поделках, но как быть в этом конкретном случае понять не могу
    Запись от iamvic размещена 15.12.2020 в 18:53 iamvic вне форума
  7. Старый комментарий
    Там ведь, когда сообщение формируется, никакого mwin ещё не существует.
    Запись от iamvic размещена 15.12.2020 в 19:16 iamvic вне форума
  8. Старый комментарий
    Мляяя!!! Всё, допёр! Спасибо! Там же тогда надо будет ещё и выход по другому делать:
    Python
    1
    2
    
            x = QMessageBox.critical(None, 'О Ш И Б К А !!!','Сообщение!')
            sys.exit(0)
    Запись от iamvic размещена 15.12.2020 в 19:31 iamvic вне форума
    Обновил(-а) iamvic 15.12.2020 в 20:17 (уточнение формулировок)
  9. Старый комментарий
    Аватар для Avazart
    Цитата:
    Там ведь, когда сообщение формируется, никакого mwin ещё не существует.
    Ну потому что возможно стоит писать код не main а в коде виджета.
    А main желательно что бы был разгружен.
    Запись от Avazart размещена 15.12.2020 в 19:53 Avazart на форуме
  10. Старый комментарий
    Как-то привык критические ошибки, препятствующие запуску приложения,
    видеть в main... Надо подумать.
    Запись от iamvic размещена 15.12.2020 в 20:21 iamvic вне форума
  11. Старый комментарий
    Аватар для Avazart
    Зависит от ситуации ...
    Можно дергать какой нибудь метод

    Python
    1
    2
    
    if not mwin.initDB():
       sys.exit(1)
    Суть в том что
    Python
    1
    
    db = QSqlDatabase.addDatabase('QPSQL')
    Скорее всего все равно придется использовать в виджите например в MVC
    Запись от Avazart размещена 15.12.2020 в 20:48 Avazart на форуме
    Обновил(-а) Avazart 15.12.2020 в 20:50
  12. Старый комментарий
    Это-то я понимаю. Но пока не могу сформулировать правильно.
    Ещё не все "болячки" расписал Всё тут в кучу соберу, а там,
    глядишь, и прояснится.
    Запись от iamvic размещена 15.12.2020 в 23:00 iamvic вне форума
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.