Задать вопрос
ZIK1337
@ZIK1337

Из-за чего возникает ошибка CreateFontIndirect failed for family?

Приложение на PyQt, с таблицей QTableWidget, QTextBrowser и другими формами (просто не знаю, из-за чего конкретно ошибка).
Имеется список на несколько тысяч элементов, каждый элемент проверяется и добавляется строка в таблицу.
Собственно, если проверять по 1000 за раз, то всё прекрасно работает.
Пробовал и 2000, 3000, 4000, а вот на 5000 уже полезли ошибки:
QWindowsFontDatabase::createEngine: CreateFontIndirect failed (Операция успешно завершена.)
QWindowsFontEngine::QWindowsFontEngine: CreateFontIndirect failed for family 'MS Shell Dlg 2' (Операция успешно завершена.)
QWindowsFontEngine::QWindowsFontEngine: GetTextMetrics failed (Неверный дескриптор.)
QWindowsFontDatabase::createEngine: CreateFontIndirect failed (Операция успешно завершена.)
QWindowsFontEngine::QWindowsFontEngine: CreateFontIndirect failed for family 'MS Shell Dlg 2' (Операция успешно завершена.)
QWindowsFontEngine::QWindowsFontEngine: GetTextMetrics failed (Неверный дескриптор.)
QWindowsFontDatabase::createEngine: CreateFontIndirect failed (Операция успешно завершена.)
QWindowsFontEngine::QWindowsFontEngine: CreateFontIndirect failed for family 'Arial' (Операция успешно завершена.)
QWindowsFontEngine::QWindowsFontEngine: GetTextMetrics failed (Неверный дескриптор.)
QWindowsFontDatabase::createEngine: CreateFontIndirect failed (Операция успешно завершена.)
QWindowsFontEngine::QWindowsFontEngine: CreateFontIndirect failed for family 'MS UI Gothic' (Операция успешно завершена.)
QWindowsFontEngine::QWindowsFontEngine: GetTextMetrics failed (Неверный дескриптор.)
QWindowsFontDatabase::createEngine: CreateFontIndirect failed (Операция успешно завершена.)
QWindowsFontEngine::QWindowsFontEngine: CreateFontIndirect failed for family 'SimSun' (Операция успешно завершена.)
QWindowsFontEngine::QWindowsFontEngine: GetTextMetrics failed (Неверный дескриптор.)
QWindowsFontDatabase::createEngine: CreateFontIndirect failed (Операция успешно завершена.)
QWindowsFontEngine::QWindowsFontEngine: CreateFontIndirect failed for family 'Arial Unicode MS' (Операция успешно завершена.)
QWindowsFontEngine::QWindowsFontEngine: GetTextMetrics failed (Неверный дескриптор.)
QWindowsFontDatabase::createEngine: CreateFontIndirect failed (Операция успешно завершена.)
QWindowsFontEngine::QWindowsFontEngine: CreateFontIndirect failed for family 'Segoe UI Emoji' (Операция успешно завершена.)
QWindowsFontEngine::QWindowsFontEngine: GetTextMetrics failed (Неверный дескриптор.)
QWindowsFontDatabase::createEngine: CreateFontIndirect failed (Операция успешно завершена.)
QWindowsFontEngine::QWindowsFontEngine: CreateFontIndirect failed for family 'Segoe UI Symbol' (Операция успешно завершена.)
QWindowsFontEngine::QWindowsFontEngine: GetTextMetrics failed (Неверный дескриптор.)

Их очень много, не вижу смысла все добавлять.
Как будто не хватает каких-то ресурсов или что? С чем связано и как можно исправить?

Настройки таблицы:
spoiler
AIAono9.jpg
BvFao2e.jpg
iXHRsD3.jpg

Настройки QTextBrowser (в нем список) на всякий случай, хотя он уже не изменяется при проверке:
spoiler
zeWxj50.jpg
LHiA4BQ.jpg
Bfcglhw.jpg

P.S.
сейчас еще 1 небольшой вывод в консоль увидел, но программа не вылетела. Это когда проскроллил в таблице, когда в нее добавлялись последние элементы (или последний прям):
spoiler
OpenType support missing for "Segoe UI", script 20
  OpenType support missing for "MS Shell Dlg 2", script 20
  OpenType support missing for "Arial", script 20
  OpenType support missing for "MS UI Gothic", script 20
  OpenType support missing for "SimSun", script 20
  OpenType support missing for "Arial Unicode MS", script 20
  OpenType support missing for "Segoe UI Emoji", script 20
  OpenType support missing for "Segoe UI Symbol", script 20
  OpenType support missing for "Nirmala UI", script 20

P.P.S.
Сейчас пробовал обернуть в try except добавление строки в таблицу - не помогло, значит ошибка не в таблице.

P.P.P.S.
Вроде как локализовал функцию, где возникает ошибка - при удалении дублей из списка (а точнее дублей аккаунтов по логину). Но обёртка в try except также не спасла...
Код, готовый для запуска
import sys
from PyQt5 import QtWidgets, QtGui, QtCore, Qt
from time import sleep
import threading


class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(1479, 781)
        sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Fixed)
        sizePolicy.setHorizontalStretch(0)
        sizePolicy.setVerticalStretch(0)
        sizePolicy.setHeightForWidth(MainWindow.sizePolicy().hasHeightForWidth())
        MainWindow.setSizePolicy(sizePolicy)
        MainWindow.setMinimumSize(QtCore.QSize(1479, 781))
        MainWindow.setMaximumSize(QtCore.QSize(1479, 781))
        font = QtGui.QFont()
        font.setPointSize(9)
        MainWindow.setFont(font)
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Fixed)
        sizePolicy.setHorizontalStretch(0)
        sizePolicy.setVerticalStretch(0)
        sizePolicy.setHeightForWidth(self.centralwidget.sizePolicy().hasHeightForWidth())
        self.centralwidget.setSizePolicy(sizePolicy)
        self.centralwidget.setMinimumSize(QtCore.QSize(1479, 781))
        self.centralwidget.setMaximumSize(QtCore.QSize(1479, 781))
        self.centralwidget.setObjectName("centralwidget")
        self.label = QtWidgets.QLabel(self.centralwidget)
        self.label.setGeometry(QtCore.QRect(0, 0, 61, 16))
        self.label.setObjectName("label")
        self.all_accounts = QtWidgets.QTextBrowser(self.centralwidget)
        self.all_accounts.setGeometry(QtCore.QRect(0, 20, 791, 521))
        self.all_accounts.setLineWrapMode(QtWidgets.QTextEdit.NoWrap)
        self.all_accounts.setReadOnly(False)
        self.all_accounts.setAcceptRichText(False)
        self.all_accounts.setObjectName("all_accounts")
        self.del_duplicate_accs = QtWidgets.QPushButton(self.centralwidget)
        self.del_duplicate_accs.setGeometry(QtCore.QRect(660, 550, 131, 23))
        font = QtGui.QFont()
        font.setPointSize(8)
        self.del_duplicate_accs.setFont(font)
        self.del_duplicate_accs.setObjectName("del_duplicate_accs")
        self.count_accs = QtWidgets.QLabel(self.centralwidget)
        self.count_accs.setGeometry(QtCore.QRect(430, 0, 91, 16))
        font = QtGui.QFont()
        font.setPointSize(9)
        font.setBold(True)
        font.setWeight(75)
        self.count_accs.setFont(font)
        self.count_accs.setObjectName("count_accs")
        self.retranslateUi(MainWindow)

    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "Check"))
        self.label.setText(_translate("MainWindow", "Аккаунты:"))
        self.del_duplicate_accs.setText(_translate("MainWindow", "Удалить дубли по лог."))
        self.count_accs.setText(_translate("MainWindow", "0"))


class ExampleApp(QtWidgets.QMainWindow, Ui_MainWindow):
    def __init__(self):
        super().__init__()
        self.setupUi(self)
        self.logins = []
        self.accounts = []
        self.max_threads = 200
        self.dupl_log = []
        self.thr = 0

        self.all_accounts.textChanged.connect(self.all_accounts_f)
        self.del_duplicate_accs.clicked.connect(self.del_dupl_accs)

    # изменение списка
    def all_accounts_f(self):
        self.accounts = []
        lists = self.all_accounts.toPlainText().split('\n')
        for l in lists:
            if l != '' and l != '\n':
                self.accounts.append(l)
        self.count_accs.setText(str(len(self.accounts)))

    # удалить дубликаты акков по логину
    def del_dupl_accs(self):
        self.all_accounts.blockSignals(True)
        if self.count_accs.text() != '0':
            self.all_accounts.clear()
            self.dupl_log = []
            self.logins = [item.split(':')[0] for item in self.accounts]
            self.logins = list(set(self.logins))
            for item in self.accounts:
                while self.thr > self.max_threads:
                    sleep(0.1)
                self.thr += 1
                x = threading.Thread(target=self.check_dupl, args=(item,), daemon=True)
                x.start()
            while self.thr > 0:
                sleep(0.1)
            for item in self.dupl_log:
                self.accounts.pop(self.accounts.index(item))

            self.count_accs.setText(str(len(self.accounts)))
        self.all_accounts.blockSignals(False)

    # поток для проверки дублей (по бд) по логину
    def check_dupl(self, item):
        if item.split(':')[0] in self.logins:
            self.logins.pop(self.logins.index(item.split(':')[0]))
            self.all_accounts.append(item)
        else:
            self.dupl_log.append(item)
        self.thr -= 1


def main():
    app = QtWidgets.QApplication(sys.argv)
    window = ExampleApp()
    window.show()
    app.exec_()


if __name__ == '__main__':
    main()

Список, на котором можно проверить: https://pastebin.com/KAUq6nM6

Суть если кратко:
Список - список аккаунтов в формате логин:пароль:токен или логин:пароль.
Из этого списка удаляются дубли по логину (причем первый уникальный остаётся), и если нужно - еще и по БД сравнивается этот логин - есть ли он там. Если есть - также удаляется из спсика.
all_accounts - это QTextBrowser
accounts - список
И вот если вставить 5000 и более строк (ну и нажать кнопку) - летят ошибки
  • Вопрос задан
  • 319 просмотров
Подписаться 1 Средний Комментировать
Пригласить эксперта
Ответы на вопрос 1
@Andy_U
Сначала разберитесь с крякозябрами - это неправильная кодировка. 866 вместо 1251 или наоборот.
Что такое script 20 - см.: https://docs.microsoft.com/en-us/typography/openty...

Что-то вы странное со шрифтами делаете. Хотя это может быть результат того, что память кончилась/поломалась. Просто в консольном варианте работа с базой данных ошибок не вызывает?
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы