Не работает PyQt интерфейс
Я написал скрипт,который проверяет IP на спам базы. При нажатии на кнопку ничего не происходит. В чем может быть проблема?
for server in blacklist:
try:
data = {'ip': per1, 'server': server}
response = requests.post(per1, data=data, timeout=3)
if response.status_code != 200:
raise ValueError('Expected 200 OK')
data = response.json()
rating = data[data.keys()[0]]
if rating != "":
self.textEdit.setText(server + ": " + rating)
core1()
except:
self.textEdit.setText("NOT LISTED: " + server + "\n")
import socket
from urllib.request import Request, urlopen
import os
from PyQt5 import QtCore, QtGui, QtWidgets
class Ui_MainWindow(object):
def setupUi(self, MainWindow):
MainWindow.setObjectName("MainWindow")
MainWindow.resize(800, 600)
self.centralwidget = QtWidgets.QWidget(MainWindow)
self.centralwidget.setObjectName("centralwidget")
self.lineEdit = QtWidgets.QLineEdit(self.centralwidget)
self.lineEdit.setGeometry(QtCore.QRect(270, 80, 113, 20))
self.lineEdit.setObjectName("lineEdit")
self.textEdit = QtWidgets.QTextEdit(self.centralwidget)
self.textEdit.setGeometry(QtCore.QRect(270, 120, 321, 291))
self.textEdit.setObjectName("textEdit")
self.pushButton = QtWidgets.QPushButton(self.centralwidget)
self.pushButton.setGeometry(QtCore.QRect(460, 80, 75, 23))
self.pushButton.setObjectName("pushButton")
MainWindow.setCentralWidget(self.centralwidget)
self.menubar = QtWidgets.QMenuBar(MainWindow)
self.menubar.setGeometry(QtCore.QRect(0, 0, 800, 20))
self.menubar.setObjectName("menubar")
MainWindow.setMenuBar(self.menubar)
self.statusbar = QtWidgets.QStatusBar(MainWindow)
self.statusbar.setObjectName("statusbar")
MainWindow.setStatusBar(self.statusbar)
self.retranslateUi(MainWindow)
QtCore.QMetaObject.connectSlotsByName(MainWindow)
def retranslateUi(self, MainWindow):
_translate = QtCore.QCoreApplication.translate
MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
self.pushButton.setText(_translate("MainWindow", "Push"))
class Window(QtWidgets.QMainWindow):
def __init__(self):
super(Window, self).__init__()
self.setupUi(self)
self.pushButton.clicked.connect(self.list)
def list(self):
per1 = self.lineEdit.text()
url = 'http://www.ip-score.com/ajax_handler/get_bls'
blacklist = [
'access.redhawk.org', 'b.barracudacentral.org', 'bl.shlink.org', 'bl.spamcannibal.org',
'bl.spamcop.net', 'bl.tiopan.com', 'blackholes.wirehub.net', 'blacklist.sci.kun.nl',
'block.dnsbl.sorbs.net', 'blocked.hilli.dk', 'bogons.cymru.com', 'cart00ney.surriel.com',
'cbl.abuseat.org', 'cblless.anti-spam.org.cn', 'dev.null.dk', 'dialup.blacklist.jippg.org',
'dialups.mail-abuse.org', 'dialups.visi.com', 'dnsbl.abuse.ch', 'dnsbl.anticaptcha.net',
'dnsbl.antispam.or.id', 'dnsbl.dronebl.org', 'dnsbl.justspam.org', 'dnsbl.kempt.net',
'dnsbl.sorbs.net', 'dnsbl.tornevall.org', 'dnsbl-1.uceprotect.net', 'duinv.aupads.org',
'dnsbl-2.uceprotect.net', 'dnsbl-3.uceprotect.net', 'dul.dnsbl.sorbs.net', 'dul.ru',
'escalations.dnsbl.sorbs.net', 'hil.habeas.com', 'black.junkemailfilter.com',
'http.dnsbl.sorbs.net', 'intruders.docs.uu.se', 'ips.backscatterer.org',
'korea.services.net', 'l2.apews.org', 'mail-abuse.blacklist.jippg.org',
'misc.dnsbl.sorbs.net', 'msgid.bl.gweep.ca', 'new.dnsbl.sorbs.net',
'no-more-funn.moensted.dk', 'old.dnsbl.sorbs.net', 'opm.tornevall.org', 'pbl.spamhaus.org',
'proxy.bl.gweep.ca', 'psbl.surriel.com', 'pss.spambusters.org.ar', 'rbl.schulte.org',
'rbl.snark.net', 'recent.dnsbl.sorbs.net', 'relays.bl.gweep.ca', 'relays.bl.kundenserver.de',
'relays.mail-abuse.org', 'relays.nether.net', 'rsbl.aupads.org', 'sbl.spamhaus.org',
'smtp.dnsbl.sorbs.net', 'socks.dnsbl.sorbs.net', 'spam.dnsbl.sorbs.net', 'spam.olsentech.net',
'spamguard.leadmon.net', 'spamsources.fabel.dk', 'tor.dnsbl.sectoor.de', 'ubl.unsubscore.com',
'web.dnsbl.sorbs.net', 'xbl.spamhaus.org', 'zen.spamhaus.org', 'zombie.dnsbl.sorbs.net',
'dnsbl.inps.de', 'dyn.shlink.org', 'rbl.megarbl.net', 'bl.mailspike.net']
for server in blacklist:
try:
data = {'ip': per1, 'server': server}
response = requests.post(per1, data=data, timeout=3)
if response.status_code != 200:
raise ValueError('Expected 200 OK')
data = response.json()
rating = data[data.keys()[0]]
if rating != "":
self.textEdit.setText(server + ": " + rating)
core1()
except:
self.textEdit.setText("NOT LISTED: " + server + "\n")
if __name__ == "__main__":
import sys
app = QtWidgets.QApplication(sys.argv)
MainWindow = QtWidgets.QMainWindow()
ui = Ui_MainWindow()
ui.setupUi(MainWindow)
MainWindow.show()
sys.exit(app.exec_())
Ответы (2 шт):
Методы определения класса
Вообще, вам стоило бы использовать какой-то один метод определения класса. По умолчанию обычно используется def __init__(self):, а класс главного окна должен сразу содержать конкретный объект class MainWindow(QMainWindow):
В вашем случае будет выглядеть так:
class Ui_MainWindow(QMainWindow):
def __init__(self):
QMainWindow.__init__(self)
self.resize(800, 600)
self.setWindowTitle("MainWindow")
...
# дальше остальной ваш код
Таком образом упрощается и вызов окна, вместо ваших четырех строк
MainWindow = QtWidgets.QMainWindow()
ui = Ui_MainWindow()
ui.setupUi(MainWindow)
MainWindow.show()
Достаточно всего 2:
ui = Ui_MainWindow()
ui.show()
По поводу проблем открытия второго окна
1. Я нигде не видел у вас в коде метода его вызова. Например, чего-то такого:
second_ui = Window()
second_ui.show())
Тем более, у вас не привязана кнопка к какой-либо функции. Должна быть такая строка:
self.pushButton.clicked.connect(self.open_second_ui), где open_second_ui - функция, внутри первого класса, запускающая второй класс при вызове.
2. Внутри второго класса вы попытались подключить кнопку pushButton к вызову функции list(), однако сама кнопка во втором классе не объявлена.
Реализация открытия второго окна
Я бы посоветовал совсем немного переделать код, чтобы в дальнейшем было удобнее работать. Попробуйте использовать 3 класса, 2 из которых - окна, а третий - основной, показывающий нужное в конкретный момент окно. Идею реализации взял здесь.
да, @V-Mor вы правильно заметили, не создаётся объект класса Window, которое будет главным окном.
и еще вам надо добавить Ui_MainWindow как наследник для class Window(QtWidgets.QMainWindow, Ui_MainWindow):
я не проверял вашу логику в методе _list. Если ваша проверка занимает много времени, вам будет необходим дополнительный поток.
import os
import socket
from urllib.request import Request, urlopen
from PyQt5 import QtCore, QtGui, QtWidgets
class Ui_MainWindow(object):
def setupUi(self, MainWindow):
MainWindow.setObjectName("MainWindow")
MainWindow.resize(800, 600)
self.centralwidget = QtWidgets.QWidget(MainWindow)
self.centralwidget.setObjectName("centralwidget")
self.lineEdit = QtWidgets.QLineEdit(self.centralwidget)
self.lineEdit.setGeometry(QtCore.QRect(270, 80, 113, 20))
self.lineEdit.setObjectName("lineEdit")
self.textEdit = QtWidgets.QTextEdit(self.centralwidget)
self.textEdit.setGeometry(QtCore.QRect(270, 120, 321, 291))
self.textEdit.setObjectName("textEdit")
self.pushButton = QtWidgets.QPushButton(self.centralwidget)
self.pushButton.setGeometry(QtCore.QRect(460, 80, 75, 23))
self.pushButton.setObjectName("pushButton")
MainWindow.setCentralWidget(self.centralwidget)
self.menubar = QtWidgets.QMenuBar(MainWindow)
self.menubar.setGeometry(QtCore.QRect(0, 0, 800, 20))
self.menubar.setObjectName("menubar")
MainWindow.setMenuBar(self.menubar)
self.statusbar = QtWidgets.QStatusBar(MainWindow)
self.statusbar.setObjectName("statusbar")
MainWindow.setStatusBar(self.statusbar)
self.retranslateUi(MainWindow)
QtCore.QMetaObject.connectSlotsByName(MainWindow)
def retranslateUi(self, MainWindow):
_translate = QtCore.QCoreApplication.translate
MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
self.pushButton.setText(_translate("MainWindow", "Push"))
# vvvvvvvvvvvvv
class Window(QtWidgets.QMainWindow, Ui_MainWindow): # + Ui_MainWindow
def __init__(self):
super(Window, self).__init__()
self.setupUi(self)
self.pushButton.clicked.connect(self._list) # _list !!!
def _list(self):
per1 = self.lineEdit.text()
url = 'http://www.ip-score.com/ajax_handler/get_bls'
blacklist = [
'access.redhawk.org', 'b.barracudacentral.org', 'bl.shlink.org', 'bl.spamcannibal.org',
'bl.spamcop.net', 'bl.tiopan.com', 'blackholes.wirehub.net', 'blacklist.sci.kun.nl',
'block.dnsbl.sorbs.net', 'blocked.hilli.dk', 'bogons.cymru.com', 'cart00ney.surriel.com',
'cbl.abuseat.org', 'cblless.anti-spam.org.cn', 'dev.null.dk', 'dialup.blacklist.jippg.org',
'dialups.mail-abuse.org', 'dialups.visi.com', 'dnsbl.abuse.ch', 'dnsbl.anticaptcha.net',
'dnsbl.antispam.or.id', 'dnsbl.dronebl.org', 'dnsbl.justspam.org', 'dnsbl.kempt.net',
'dnsbl.sorbs.net', 'dnsbl.tornevall.org', 'dnsbl-1.uceprotect.net', 'duinv.aupads.org',
'dnsbl-2.uceprotect.net', 'dnsbl-3.uceprotect.net', 'dul.dnsbl.sorbs.net', 'dul.ru',
'escalations.dnsbl.sorbs.net', 'hil.habeas.com', 'black.junkemailfilter.com',
'http.dnsbl.sorbs.net', 'intruders.docs.uu.se', 'ips.backscatterer.org',
'korea.services.net', 'l2.apews.org', 'mail-abuse.blacklist.jippg.org',
'misc.dnsbl.sorbs.net', 'msgid.bl.gweep.ca', 'new.dnsbl.sorbs.net',
'no-more-funn.moensted.dk', 'old.dnsbl.sorbs.net', 'opm.tornevall.org', 'pbl.spamhaus.org',
'proxy.bl.gweep.ca', 'psbl.surriel.com', 'pss.spambusters.org.ar', 'rbl.schulte.org',
'rbl.snark.net', 'recent.dnsbl.sorbs.net', 'relays.bl.gweep.ca', 'relays.bl.kundenserver.de',
'relays.mail-abuse.org', 'relays.nether.net', 'rsbl.aupads.org', 'sbl.spamhaus.org',
'smtp.dnsbl.sorbs.net', 'socks.dnsbl.sorbs.net', 'spam.dnsbl.sorbs.net', 'spam.olsentech.net',
'spamguard.leadmon.net', 'spamsources.fabel.dk', 'tor.dnsbl.sectoor.de', 'ubl.unsubscore.com',
'web.dnsbl.sorbs.net', 'xbl.spamhaus.org', 'zen.spamhaus.org', 'zombie.dnsbl.sorbs.net',
'dnsbl.inps.de', 'dyn.shlink.org', 'rbl.megarbl.net', 'bl.mailspike.net']
for server in blacklist:
try:
data = {'ip': per1, 'server': server}
response = requests.post(per1, data=data, timeout=3)
if response.status_code != 200:
raise ValueError('Expected 200 OK')
data = response.json()
rating = data[data.keys()[0]]
if rating != "":
self.textEdit.setText(server + ": " + rating)
core1()
except:
# self.textEdit.setText("NOT LISTED: " + server + "\n")
self.textEdit.append("NOT LISTED: " + server)
if __name__ == "__main__":
import sys
app = QtWidgets.QApplication(sys.argv)
# MainWindow = QtWidgets.QMainWindow()
# ui = Ui_MainWindow()
# ui.setupUi(MainWindow)
# MainWindow.show()
w = Window() # +
w.show() # +
sys.exit(app.exec_())
