class MainWindowClass(QMainWindow):
def __init__(self, parent)
super().__init__(parent)
self.parent = parent # - просто создаём себе переменную где указываем родителя. Который передаётся при создании экземпляра.
class LoginWindowClass(QWidget):
def __init__(self, parent)
super().__init__(parent)
self.parent = parent
class ConnectionClass(QTcpServer):
def __init__(self, parent)
super().__init__(parent)
self.parent = parent
class ProfilerAppClass():
def __init__():
self.childs = { # и список чайлдов... хотя QT по идее сам должен был составить подобный список, и вообще не понятно зачем отдельный клас, можно сразу использовать словарь...
"MainWindow": MainWindowClass(self)
"LoginWindow": LoginWindowClass(self)
"Connection": ConnectionClass(self)
}
ProfilerApp = ProfilerAppClass()
ProfilerApp.childs.get("MainWindow").show()
#!/usr/bin/python
# -*- coding: utf-8 -*-
import webbrowser
from PyQt5.QtWidgets import *
from PyQt5.QtWebEngineWidgets import *
s = str("""<!DOCTYPE html>
<html>
<head></head>
<div style="text-align: center;">
<iframe frameborder="0" allowtransparency="true" scrolling="no" src="https://money.yandex.ru/quickpay/shop-widget?account=410013878567203&quickpay=shop&payment-type-choice=on&mobile-payment-type-choice=on&writer=seller&targets=asdf&targets-hint=&default-sum=&button-text=01&successURL="" width="450" height="200"></iframe>
</div>
<div>
<a href="http://google.com">TEST LINK</a>
</div>
</body>
</html>""")
class MainWindow(QWidget):
def __init__(self, parent=None):
QWidget.__init__(self, parent)
self.resize(700, 400)
self.view = QWebEngineView(self)
mypage = MyPage(self.view)
self.view.setPage(mypage)
mypage.setHtml(s)
grid = QGridLayout()
grid.addWidget(self.view, 0, 0)
self.setLayout(grid)
self.show()
class MyPage(QWebEnginePage):
def __init__(self, parent):
super().__init__(parent)
self.in_window = False # придумал переменную
def createWindow(self, type): # которую мы
self.in_window = True # тутже изменяем если просится
return self # открытие в новом окне
def acceptNavigationRequest(self, QUrl, type, isMainFrame):
url_string = QUrl.toString()
print(type, isMainFrame, QUrl)
if self.in_window and type==2 and url_string != "https://money.yandex.ru/quickpay/confirm.xml":
webbrowser.open(url_string)
self.in_window = False
self.setHtml(s)
return True
if __name__ == '__main__':
app = None
if not QApplication.instance():
app = QApplication([])
dlg = MainWindow()
if app: app.exec_()
print (type(text))
<class 'str'>.
from PyQt5 import Qt
app = Qt.QApplication([])
textEdit = Qt.QTextEdit()
textEdit.show()
secret = "<H4>test<H2>L, <H3>L"
textEdit.setText(secret)
html = textEdit.toHtml()
td = Qt.QTextDocument()
td.setHtml(html)
formats = td.allFormats()
print(formats)
app.exec_()
import keyboard
while True:
print(keyboard.is_pressed("space")) # printed True or False
#!/usr/bin/python3
# -*- coding: utf-8 -*-
# вообще достаточно просто преобразовывать текст в число и работать с ним:
def prostoe_preobrazovanie_texta_v_chislo(text):
try: # а вдруг там не число, а хрен пойми что?
chislo = int(text) # собственно вот нужная нам строчка...
return chislo
except Exception:
return False
# но иногда приходится выковыривать число из текста:
def slojnoe_raspoznovanie_chisla(text):
try: # а вдруг там число всё же где то есть?
import re
chislo = int(re.findall('(\d+)', text)[0]) # магия!
return chislo
except Exception:
return False
# ну и конечно обратное действие:
def preobrazovanie_chisla_v_text(i):
return str(i)
# вообще для чисел был специально придуман QSpinBox и QDoubleSpinBox
# но отвечая на Ваш вопрос мы всё же сделаем и вариант с QLineEdit
from PyQt5.QtWidgets import (QWidget, QLabel, QLineEdit, QApplication, QPushButton, QBoxLayout, QDoubleSpinBox)
from PyQt5.Qt import Qt
class Example(QWidget):
def __init__(self):
super().__init__()
self.initUI()
def initUI(self):
layout = QBoxLayout(QBoxLayout.Down, self) # - это для компоновки
self.qle = QLineEdit("", self) # почему lbl в локальной видимости а qle нет?
# self - тут очень важно иначе как вы будете обращятся к своему qle?
self.qle.setPlaceholderText("Например: 56") # - самая крутая killer фича...
layout.addWidget(self.qle) # - ну и отдаём его компоновщику...
button = QPushButton("математика!") # - вы же хотели ещё и кнопку да?
button.pressed.connect(self.my_super_puper_function) # вот так соединяем нажатие с методом
layout.addWidget(button) # - уж попроще всяких button.move(60, 40)
self.spinbox = QDoubleSpinBox() # - пример виджета который изначально под это заточен
self.spinbox.setRange(0, 99999999) # к сожелению по умолчанию там стоят жёсткие ограничения
layout.addWidget(self.spinbox)
self.lbl = QLabel("\n\n\n") # - это ведь label - я угадал?
layout.addWidget(self.lbl)
self.setWindowTitle('Простой пример')
self.show()
def keyPressEvent(self, e):
if e.key() == Qt.Key_Enter:
self.my_super_puper_function() # а что мешало прямо тут реализовывать математику?
# ну мы же ещё и кнопку хотим подключить на то же самое...
def my_super_puper_function(self): # та самя функция...
# в большинстве случаев математика не работает потому что в qlineedit изначально распологаются не числа,
# а текст. Ну и как вы к "абвгд" прибавите 10 ?
# никак... сначало нам нужно убедится что там действительно число:
i = self.proverki_na_chislo() # вообщемто просто: я вынес всю магию в отдельный метод...
# и этот метод возвращяет число именно числом а не текстом.
if i: # если там вообще число, тогда:
self.matematika(i) # математику в студию!
def matematika(self, a): # я думаю в комментариях не нуждается...
b = a * 7 * 1443 # моя любимая математика: она утраивает двухзначное число :)
# со spinbox-м просто:
self.spinbox.setValue(b / 11111 * 12345 / 54321 * 5) # будет работать, я гарантирую...
# а вот для qlineedit тяжелее:
b_text = preobrazovanie_chisla_v_text(b) # число нужно сначало сделать текстом.
self.qle.setText(b_text) # и лишь потом выводить.
# ну и всякие смехуёчки..., куда же без них?
if b < 10**10:
self.lbl.setText("Конкретная математика - для реальныйх пацанов!")
else:
self.lbl.setText("ОЛОЛОЛО!!!!")
# а этом вообщем то следовало бы остановится...
# но мой qt вылетает без предупреждений если в lineEdit вписать хоть одну букву...
# и тут меня понесло:
def proverki_na_chislo(self):
text = self.qle.text()
if text != "": # если наше поле не пустое
i = prostoe_preobrazovanie_texta_v_chislo(text) # пробуем простое преобразование
if i: # ну и если удечно:
return i # выходим из этой функции уже с числом.
i = slojnoe_raspoznovanie_chisla(text) # а если так и не вышли то пробуем более сложное.
if i:
self.lbl.setText(text + " - разве это число?\n" + "тут конечно есть число: " + str(i) + "\nно я с ним ничего решать не буду!")
return i
self.lbl.setText("Пожалуйста не материтесь...") # в противном случае скорее всего число вообще не написано:
return False
else:
self.lbl.setText("нужно вписать число!")
return False
if __name__ == '__main__':
import sys
app = QApplication(sys.argv)
ex = Example()
ex.show()
sys.exit(app.exec_()) # без этого ничего не запустится...
# как то-так... ну вы держитесь там. Всего вам доброго!
# кнопка: http://pyqt.sourceforge.net/Docs/PyQt4/qpushbutton.html
min = QPushButton()
# минимизация: http://pyqt.sourceforge.net/Docs/PyQt4/qwidget.html#showMinimized
def minimization():
min.showMinimized()
# связывание с нажатием: http://pyqt.sourceforge.net/Docs/PyQt4/new_style_signals_slots.html
min.pressed.connect(minimization)
# у меня python версии 3.5
# pyqt - 5-ой версии.
## Минимальная затравка для запуска кода :
# coding=UTF8
# это чтобы можно было переменные по русски называть.
# обязательно при этом сохранять py фаил в UTF
# импорты:
import sys
from PyQt5.Qt import QApplication, QPushButton, QFileDialog,\
QTableWidget, QTableWidgetItem, QGridLayout, QWidget, pyqtSignal
app = QApplication([])
# ну а теперь будем мудрить. Честно говоря ваш уровень
# владения python-м совсем не ясен. Потому начнём с супер нуля.
# None и pass - обозначают пустату (т.е. ничто).
# Она нам понадобится в дальнейшем :).
кнопка = None # надеюсь понятия переменные
# обьяснять не надо. Кнопку назовём кнопка.
# КЭП уплывёт, а кнопка останется в памяти интерпретатора.
# для начало нам нужно знать что всё что отображается
# на экране это какие то объекты, а не их описание.
class open_kn(QPushButton): pass # - это описание.
# Оно как ДНК для будущего ребёнка,
# но при этом само ребёнком не является.
# детки создаются как-то так:
open_kn() # - это создание экземпляра класса.
# Мы как бы говорим интерпретатору что хотим "породить"
# один экземпляр всего того что описано в "ДНК" open_kn.
# при этом обычно выполняются все инструкции в нутри
# конструктора класса (это тот который def __init__)
# но у нас пока что такой метод не назначен поэтому
# "ребёнок" просто унаследует всё что есть в QPushButton
# но созданный экземпляр как и КЭП появившись и
# пояснив компьютеру что мы от него хотим сразу самовыпиливается.
# поэтому нам нужна переменная для его хранения:
кнопка = open_kn() # кнопка - наш ребёнок, а open_kn - наше ДНК.
# так нам надо ещё сделать на ней текст и заставить отрисовыватся на экране:
# вообще эти два метода могли быть и в конструкторе :
class open_kn(QPushButton):
def __init__(self):
# а кстати да - методы создаются именно через
# def %название_метода%(аргументы):
self.setText('Open') # устанавливаем текст на кнопке
# но всё это нафиг не нужно если в вашем классе всего
# один метод, и тот конструктор -
# тогда зачем вам вообще такой класс?
кнопка = QPushButton()
кнопка.setText('Open')
def всё_что_будет_происходить_при_нажатии_на_кнопку():
# аналогично не обязательно переопределять целый класс FileDialog всего для одного метода...
# так с кнопкой разобрались. Теперь нам нужен диалог и таблица.
fileName = QFileDialog.getOpenFileName \
(кнопка, 'Простой пример', 'd:\\',"Текст (*.txt)")[0] # ваш код, не буду его коментировать.
f = open(fileName, 'r', encoding="utf8")
# я добавил encoding="utf8" потому что мои txt именно в таком формате
# кстати говоря именно ваши "try, except" и скрывают от вас настоящию ошибку.
# "Неожиданная ошибка:" - очень информативно...
# тут пока без изменеинй.
data = []
with f as f:
for i in f.readlines():
data.append(i)
# TableWidget.data = data # ага какой нафиг TableWidget когда мы его ещё не определили?
# впрочем х*@ с ним...
# вы же сами сказали что ваш table в HBox4 ? значит путь бедет примерно такой:
экземпляр_класса_HBox4.table.update(data) # мы просто напрямую вызываем нужный нам метод
# РИСУЕМ!
class TableWidget(QTableWidget):
# я немного переделал: сразу перенёс всю настройку таблици в метод update
def __init__(self, parent=None, data=[]):
super(TableWidget, self).__init__(parent)
self.update() # ну и чтобы не повторятся просто вызываю этот метод
def update(self, data=[]):
self.setColumnCount(1)
self.setRowCount(len(data))
for i, entry in enumerate(data, start=1): # у вас "нулевая" строка в txt
# - комментарий?
self.setRowCount(i)
item = QTableWidgetItem()
item.setText(str(entry))
self.setItem(i-1, 0, item) # - либо тут "-1" либо начинать с нулевого элемента,
# либо в setRowCount делать +1...
print(data) # - для отладки посмотрим: а вдруг данные всё таки передаются,
# а в таблицу не пишутся?
class HBox4(QGridLayout):
def __init__(self, parent=None):
super(HBox4, self).__init__(parent)
table = TableWidget() # - так не правильно.
# поясню: Вы только что создали переменную внутри метода.
# фишка в том что python по окончании метода
# забывает напроч обо всех созданных внутри него переменных. так-то.
self.table = TableWidget() # - так правильно. + мы сможем к нему обращятся.
self.addWidget(кнопка, 0, 0)
self.addWidget(self.table, 1, 0)
экземпляр_класса_HBox4 = HBox4()
# сам QGridLayout отображатся не умеет вне виджета
# я создам для него виджет.
widget = QWidget()
widget.setLayout(экземпляр_класса_HBox4)
widget.show() # пуф!..
# да мы забыли связать события нажатия на кнопку и наш метод:
кнопка.pressed.connect(всё_что_будет_происходить_при_нажатии_на_кнопку)
#В принципе на этом можно было бы и остановится,
# но в идеале было бы пользоватся сигналами и слотами:
# они вам понадобятся позже когда вы начнёте вызывать методы одновременно
# или например из потоков.
class TableWidget(QTableWidget):
my_signal_update = pyqtSignal(list) # придумываем сигнал my_signal_update
# (в качесте параметров он принимать будет list (там могло быть что угодно: int, str)
def __init__(self, parent=None, data=[]):
super(TableWidget, self).__init__(parent)
self.update()
self.my_signal_update.connect(self.update) # добавлено
def my_slot_update(self, data): # добавлено
print(data, flush=True) # добавлено
self.update() # добавлено
# ну а дальше без изменений.
def update(self, data=[]):
self.setColumnCount(1)
self.setRowCount(len(data))
for i, entry in enumerate(data, start=1):
self.setRowCount(i)
item = QTableWidgetItem()
item.setText(str(entry))
self.setItem(i-1, 0, item)
def всё_что_будет_происходить_при_нажатии_на_кнопку():
fileName = QFileDialog.getOpenFileName \
(кнопка, 'Пример с сигналом и слотом', 'd:\\', "Текст (*.txt)")[0]
f = open(fileName, 'r', encoding="utf8")
data = []
with f as f:
for i in f.readlines():
data.append(i)
table.my_signal_update.emit(data) # мы просто НЕ напрямую вызываем нужный нам метод...
кнопка.pressed.connect(всё_что_будет_происходить_при_нажатии_на_кнопку)
table = TableWidget()
экземпляр_класса_HBox4.addWidget(table, 2, 0)
# ну и последний кусочек для минимальнно рабочего приложения на pyqt
app.exec_() # без этого ничего не запустится...
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_())
class МойПервыйТаймерНаQt(QtCore.QObject):
def __init__(self):
super().__init__()
self.basictimer = QtCore.QBasicTimer()
self.basictimer.start(2000, self) # задержка в миллисекундах. 2000 для примера потому что 10 сек мне долго.
def timerEvent(self, QTimerEvent):
get_docs(self) # вы конечно можете создать обьект sched.scheduler и передавать его, но зачем?
if __name__ == "__main__":
app = QtGui.QApplication(sys.argv)
main_window = main_cl()
мой_первый_таймер_на_Qt = МойПервыйТаймерНаQt()
sys.exit(app.exec_())