Пользователь пока ничего не рассказал о себе

Достижения

Все достижения (6)

Наибольший вклад в теги

Все теги (19)

Лучшие ответы пользователя

Все ответы (34)
  • Что написать на Python новичку, чтобы удостовериться в своих знаниях?

    @Sergey6661313
    checkio.org пробовали? да задачки простые, но там есть функция "посмотреть другие варианты решений". И вот там самый смак...
    Ответ написан
  • Почему при вызове setHtml программа вылетает?

    @Sergey6661313
    res = requests.get('http://URL/'+trek+".html")
    orly?
    ну ей богу написали хотя бы "yandex.ru/index.html" для примера.

    без объяснения причин
    ну пожалуйста пользуйтесь pycharm - есть бесплатная редакция. Он честно открывает консоль для каждой запущенной программы. В которую честно пишется причина. И которая, Самое главное, не закрывается после ошибки.

    куски кода надо делать минимальными, НО запускаемыми. например такими:
    import sys
    import requests
    import os
    from PyQt5.QtWidgets import QTextBrowser
    from PyQt5.Qt import QApplication
    from PyQt5.Qt import QThread
    
    trek = "index"
    myapp = QApplication(sys.argv)
    myapp.textBrowser = QTextBrowser()
    
    class ExperementalThread(QThread):
        def run(self):
            if os.path.exists("temp/"+trek+".html"):  # Если страница уже была ранее загружена
                with open("temp/"+trek+".html") as w:
                    myapp.textBrowser.setHtml(w.read())  # ни разу не вылетело
            else:
                res = requests.get('http://yandex.ru/'+trek+".html")
                res.encoding = 'utf-8'
                with open("temp/"+trek+".html", "w") as ri:
                    ri.write(res.text)
                myapp.textBrowser.setHtml(res.text)  # И здесь
    
    thread = ExperementalThread()
    myapp.textBrowser.show()
    thread.start()
    myapp.exec()


    и ошибка соотв. будет QObject: Cannot create children for a parent that is in a different thread.
    что значит что метод setHtml пытается для себя создать отдельный поток. А потоки из потоков создавать запретил сам батюшка Ленин ( цитата от ██.██.19██г. ).

    Значит придётся использовать сигналы и слоты.
    я создал свой класс MyQTextBrowser с наследованием QTextBrowser и сигналом signal_load_html. Который в свою очередь связал с setHTML.

    # coding=utf-8
    
    import sys, requests, os                            # импортировали,
    from PyQt5.Qt        import QApplication, QThread   # импортировали,
    from PyQt5.QtCore    import pyqtSignal              # да не
    from PyQt5.QtWidgets import QTextBrowser            # выпереимпортировали.
    
    trek = "index"                                      # ну в самом деле надо же указать чему равна ваша переменная.
    myapp = QApplication(sys.argv)                      # я угадал?
                                                        # обязательно делаем отступы перед каждым классом
    class MyQTextBrowser(QTextBrowser):                 # создаём класс и наследуем QTextBrowser
        signal_load_html = pyqtSignal(str)              # назначаем сигнал (сигнал принимает значение str (строки) )
                                                        # тут тоже отступ
        def __init__(self):                             # переназначаем метод создания объектов
            super().__init__()                          # наследуем/выполняем QTextBrowser.__init__(self)
            self.signal_load_html.connect(self.setHtml) # тут связываем наш сигнал с setHtml
    myapp.textBrowser = MyQTextBrowser()                # ну и создаём вообщемто обьект нашего класса MyQTextBrowser
                                                        # обязательно делаем отступы после каджого класса.
                                                        # обязательно делаем отступы перед каждым классом
    class ExperementalThread(QThread):                  # названия придумываем на ходу
        def run(self):                                  # init не нужен сразу run
            if os.path.exists("temp/"+trek+".html"):    # Если страница уже была ранее загружена
                with open("temp/"+trek+".html") as w:   # открываем наш фаил в папке temp
                    # myapp.textBrowser.setHtml(w.read())  # вылетает? у меня кстати нет, но я читер :)
                    myapp.textBrowser.signal_load_html.emit(w.read())  # ни разу не вылетело.
            else:                                       # люблю когда много коментариев в коде
                res = requests.get('http://yandex.ru/'+trek+".html") # "Люблю говорить - это помогает думать."
                res.encoding = 'utf-8'                  # -- Томас Стернз Элиот
                with open("temp/"+trek+".html", "w") as ri: # когда этот код уже кончится?
                    ri.write(res.text)                  # тут пусто потому что в оригинале у вас был "URL" а не yandex
                # myapp.textBrowser.setHtml(res.text)   # И здесь
                myapp.textBrowser.signal_load_html.emit(res.text)  # ни разу не вылетело
                                                        # обязательно делаем отступы после каждого класса.
    thread = ExperementalThread()                       # создаём наш поток
    myapp.textBrowser.show()                            # ах да - самое главное показать окно. Иначе ничего не произойдёт
    thread.start()                                      # запускаем поток
    myapp.exec()                                        # Ой, всё!()


    p.s.
    Вообще setHtml не метод QTextBrowser. Это метод из QTextEdit (который QTextBrowser наслеует. ) Сам же QTextBrowser создан для того чтобы самостоятельно загружать и показывать страницы с интернета. (по урлу.)
    Ответ написан
  • Как правильно пользоваться таймером в PyQt?

    @Sergey6661313
    Ваш код делает именно то что вы и написали.
    timer.start(1000) - запускает таймер
    timer.stop() - останавливает таймер. При чём в нашем случае ещё до реального запуска таймера т.к. app.exec() ещё даже не запущен.
    Каких действий вы от него ожидаете если вы его остановили???
    Ответ написан
  • Как исправить ошибку с PyQT5?

    @Sergey6661313
    там на семёрке случаем не 32-битная система?
    Я везде таскаю с собой только 32-битную сборку python-а с предустановленным в него pyqt и
    библиотеку Microsoft Visual C++ 2010 x86 (он маленький 5 мб всего).

    Ещё возможно проблема в правах к самой папки... Если вы не являетесь владельцем папки, то винда может устраивать такие подлянки...
    Ответ написан
  • Почему при компиляции и запуска кода ничего не выводит на экран?

    @Sergey6661313
    Вообще как вы используете uic?
    чтобы создать запускаемый фаил надо использовать ключ "-x"
    например так:
    pyuic4.bat -x other.ui -o other.py

    и тогда к вашему коду будет добавлено что-то вроде:
    if __name__ == "__main__":
        import sys
        app = QtGui.QApplication(sys.argv)
        Form = QtGui.QWidget()
        ui = Ui_Form()
        ui.setupUi(Form)
        Form.show()
        sys.exit(app.exec_())


    Посмотрите на ваш код без куска выше - глазами транслятора:
    1) импортируем что-то...
    2) пробуем назначить переменную _fromUtf8 и метод для неё. Выделяем под них память
    3) пробуем назначить переменную _encoding и метод для неё. Выделяем под них память
    4) какой то непонятный класс Ui_Form - выделяем под него память
    4.5) ага там ещё и 2 метода. Мы под них в памяти место выделим, а использовать потом будет если его конечно вызовут...
    5) код кончился.
    Эй программист! Код кончился, что мне делать дальше !?. А завершусь ка я...
    Process finished...

    Как ответил abcd0x00 вам необходимо либо наследовать эту форму, либо вызвать её.
    Почитайте вводные курсы по pyqt например от Прохоренока Н.А. - самое начало:
    для запуска pyqt приложений должно быть инициализировано PyQt4.QtGui.QApplication
    затем инициировать все ваши формы и потом чтобы приложение вдруг не завершилось (потому что на этом код и кончится) выполнить QApplication.exec(), который заставить python интерпретатор бесконечно перерисовывать и обновлять состояние ваших форм.
    Да-да именно так и работают все программы (не только на pyqt).
    Ответ написан

Лучшие вопросы пользователя

Все вопросы (12)