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_())
def buttonClicked(self):
print((a[9:]))
window.tree.setText(str(a[9:]))
sender = self.sender()
# coding=utf-8
import sys
from PyQt4 import QtGui
from PyQt4.QtGui import QPushButton, QTableWidget
from PyQt4.Qt import QApplication
window = QApplication(sys.argv)
class myTable(QTableWidget):
class MyCustomEditButton(QPushButton):
def __init__(self, i, name):
self.i = i
super().__init__(name)
self.clicked.connect(self.slot_pressed)
def slot_pressed(self):
window.tableWidget.StartStop(self.i)
def __init__(self):
super().__init__()
self.data = [
["1 строка"],
["2 строка"],
["3 строка"],
["4 строка"],
["5 строка"]
]
self.datacount = len(self.data)
self.setColumnCount(len(self.data[0])+1)
self.setRowCount(self.datacount)
for i in range(self.datacount):
btn = self.MyCustomEditButton(i, "Edit")
self.data0 = str(self.data[i][0])
self.setItem(i, 0, QtGui.QTableWidgetItem(self.data0))
self.setCellWidget(i, 1, btn)
def StartStop(self, bb):
print(bb)
window.tableWidget = myTable()
window.tableWidget.show()
window.exec()
res = requests.get('http://URL/'+trek+".html")orly?
без объяснения причинну пожалуйста пользуйтесь 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()
# 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() # Ой, всё!()
class OpenFile(QtGui.QMainWindow):
def __init__(self, parent=None):
... ... ...
self.comboBox = QtGui.QComboBox(self)
self.comboBox.setGeometry(QtCore.QRect(25, 55, 125, 25))
self.comboBox.setObjectName(self.trUtf8("comboBox"))
for sName in wbr.sheet_names():
sheetName.append(wbr.sheet_by_name(sName))
self.comboBox.addItem(str(sName))
sheet = wbr.sheet_by_index(self.comboBox.currentIndex())
class OpenFile(QtGui.QMainWindow):
def __init__(self, parent=None):
QtGui.QMainWindow.__init__(self, parent)
... ... ...
pButton2 = QtGui.QPushButton('записать в csv', self)
pButton2.setGeometry(175, 55, 125, 25)
self.connect(pButton2, QtCore.SIGNAL('clicked()'), self.slot_list_selected)
def showDialog(self):
filename = QtGui.QFileDialog.getOpenFileName(self, 'Выбор файла', '*xls')
self.wbr = xlrd.open_workbook(filename, formatting_info=True)
self.comboBox.addItems(self.wbr.sheet_names())
def slot_list_selected(self):
# //////////////////Индекс листа///////////////////////
sheet = self.wbr.sheet_by_index(self.comboBox.currentIndex())
... ... ...
class OpenFile(QtGui.QMainWindow):
def __init__(self, parent=None):
QtGui.QMainWindow.__init__(self, parent)
self.setGeometry(300, 300, 325, 100)
self.setWindowTitle(self.trUtf8('Выбор файла'))
self.setWindowIcon(QtGui.QIcon('imageformats\icon.jpeg'))
pButton = QtGui.QPushButton('Открыть файл', self)
pButton.setGeometry(25, 15, 125, 25)
self.connect(pButton, QtCore.SIGNAL('clicked()'), self.showDialog)
quit = QtGui.QPushButton('Выход', self)
quit.setGeometry(175, 15, 125, 25)
self.connect(quit, QtCore.SIGNAL('clicked()'),
QtGui.qApp, QtCore.SLOT('quit()'))
self.comboBox = QtGui.QComboBox(self)
self.comboBox.setGeometry(QtCore.QRect(25, 55, 125, 25))
self.comboBox.setObjectName(self.trUtf8("comboBox"))
self.comboBox.activated.connect(self.slot_list_selected)
def showDialog(self):
filename = QtGui.QFileDialog.getOpenFileName(self, 'Выбор файла', '*xls')
self.wbr = xlrd.open_workbook(filename, formatting_info=True)
self.comboBox.blockSignals(True)
self.comboBox.clear()
self.comboBox.addItems(["выберите лист"] + self.wbr.sheet_names())
self.comboBox.blockSignals(False)
def slot_list_selected(self, list_index):
if list_index:
# //////////////////Индекс листа///////////////////////
sheet = self.wbr.sheet_by_index(list_index-1)
print(list_index)
vals = []
i = 0
a = 0
for rows in range(sheet.nrows):
vals.append(sheet.row_values(rows))
# /////////////Удаляем из массива шапку Промоактивности//////////////
for a in range(4):
del vals[0]
a = +1
file_csv = open('C:\promo.csv', 'w')
for i in range(sheet.nrows - 4):
stroka_0 = str(vals[i]).replace('[', '')
stroka_1 = stroka_0.replace(',', ';')
stroka_2 = stroka_1.replace(']', '')
stroka_3 = stroka_2.replace(' ', '')
stroka_4 = stroka_3.replace("'", '')
stroka_5 = stroka_4.replace(".0", '')
file_csv.write(stroka_5 + "\n")
i = +1
file_csv.close()
def hideEvent(self, event):
QtGui.QMainWindow.hideEvent(self, event) # или без self уже не помню.
self.trayIcon = QtGui.QSystemTrayIcon(QtGui.QIcon(“myicon.png”),self) # где myicon.png картинка вашей иконки...
self.trayIcon.show()