Я запускаю локальный сервер MySQL для разработки своего приложения PyQt. Было бы неплохо, если бы я мог отображать QMessageBox, если сервер не работает, чтобы конечные пользователи имели представление, почему приложение не запускается.
Если я выключу сервер и запущу свою программу с терминала, я получу обычный ответ:
pymysql.err.OperationalError: (2003, "Can't connect to MySQL server on '127.0.0.1' (2)")
мой код простой
import pymysql as lite
con = lite.connect(host='127.0.0.1',unix_socket='/run/mysqld/mysqld.sock', user='ivica',passwd='pass',db='baza',charset='utf8')
#define one class that inherits QMainWindow and so on...
Есть ли способ для меня фактически отобразить QMessageBox с сообщением «Сервер MySQL не работает!» или что-то подобное? Если сервер MySQL не запущен, окно моего приложения даже не будет отображаться, только ошибка терминала.
:РЕДАКТИРОВАТЬ:
После предложенных изменений мой код выглядит так:
con = None #this is how I make it global, eg. not in any method or class (?)
def dbconnect():
global con
#con = None
try:
if os.name == 'nt':
con = lite.connect(host='127.0.0.1', user='ivica',passwd='pass',db='baza',charset='utf8')
else:
con = lite.connect(host='127.0.0.1',unix_socket='/run/mysqld/mysqld.sock', user='ivica',passwd='pass',db='baza',charset='utf8')
except lite.err.OperationalError as err:
msgBox = QtGui.QMessageBox()
msgBox.setText(str(err))
msgBox.show()
return con
class Logon(QtGui.QDialog):
def __init__(self):
QtGui.QDialog.__init__(self)
self.ui=Ui_dlgLogovanje()
self.ui.setupUi(self)
QtCore.QObject.connect(self.ui.dugmeUloguj, QtCore.SIGNAL("clicked()"), self.doLogin)
def doLogin(self):
with dbconnect():
cur = dbconnect().cursor()
и ошибка, которую я получаю:
Traceback (most recent call last):
File "main.py", line 59, in doLogin
with dbconnect():
AttributeError: __exit__
: РЕДАКТИРОВАТЬ 2:
После ответа unutbu и некоторых моих возни с кодом это решение, которое я искал:
con = None
def dbconnect():
global con
try:
if os.name == 'nt':
con = lite.connect(host='127.0.0.1', user='ivica',passwd='pass',db='baza',charset='utf8')
else:
con = lite.connect(host='127.0.0.1',unix_socket='/run/mysqld/mysqld.sock', user='ivica',passwd='pass',db='baza',charset='utf8')
except lite.err.OperationalError as err:
msgBox = QtGui.QMessageBox()
msgBox.setText(str(err))
msgBox.show()
return con
class Logon(QtGui.QDialog):
def __init__(self):
QtGui.QDialog.__init__(self)
self.ui=Ui_dlgLogovanje()
self.ui.setupUi(self)
QtCore.QObject.connect(self.ui.dugmeUloguj, QtCore.SIGNAL("clicked()"), self.doLogin)
def doLogin(self):
if con == None:
reply = QtGui.QMessageBox.warning(self, 'Greška',
"Can't establish connection to database!", QtGui.QMessageBox.Ok)
if reply == QtGui.QMessageBox.Ok:
self.close() #and when user clicks OK program closes
else:
with dbconnect():
cur = dbconnect().cursor()
#do other database stuff, check credentials etc.
AttributeError
только тогда, когдаlite.connect
терпит неудачу, или вы получаете его, даже если соединение установлено успешно? - person unutbu   schedule 15.09.2012con
равноNone
, у которого нет метода__exit__
. Вот почемуwith dbconnect()
терпит неудачу. Что вы хотите, чтобы произошло, если соединение не работает? - person unutbu   schedule 15.09.2012with
. Просто вызовитеdbconnect()
один раз в начале скрипта. Затем вы можете использовать глобальныйcon
в любом месте скрипта. Это упрощает написание сценария, хотя я должен упомянуть, что у него есть как минимум две потенциальные проблемы: (1) ваш сервер может разрешать ограниченное количество соединений, поэтому перехват соединения на протяжении всей программы может быть плохим. (2) Если соединение не используется в течение длительного времени, оно может истечь, и в этом случае ваша программа может неожиданно выйти из строя, если вы не добавите дополнительный код для обработки этого... - person unutbu   schedule 16.09.2012