Мне нужно сделать простой графический интерфейс, который может соединиться с sql.
Как я могу передавать переменные из одного окна -> второго?
Моя проблема:
- У меня есть окно с панелью входа в систему (QLogin.py), которая тестирует соединение с сервером sql.Если он может подключиться - хорошо, войдите в систему. Если нет, верните ошибку.Это работает
- В моем главном окне (QApp.py) мне нужно выполнить sql запросы и вернуть результат в мой qtablewidget (и т. Д.)
- Я хотел передать переменные:
login = self.username.text()
& pwd = self.password.text()
из QLogin в QApp, чтобы установить новое соединение для выполнения запросов, но это не работает.
Может быть, кто-то найдет лучший вариант, как это решить?
Подводя итог: После ввода IMEI в QApp.py я хотел бы выполнить SQL-запрос, используя учетные данные и механизм подключения из QLogin.py.
- Введите SQL-логин и пароль в QLogin.py
- Введите IMEI и нажмите кнопку -> выполнить запрос sql
QLogin.py
# -- coding: utf-8 --
from PyQt5.QtWidgets import QLineEdit,QDialogButtonBox,QFormLayout,QDialog,QMessageBox
from PyQt5 import QtWidgets
from PyQt5.QtCore import Qt
from PyQt5 import QtGui
import qdarkstyle
import sqlalchemy
class LoginDialog(QDialog):
def __init__(self, parent=None):
super(LoginDialog,self).__init__(parent)
self.init_ui()
def init_ui(self):
### delete question mark
self.setWindowFlags(self.windowFlags()
^ Qt.WindowContextHelpButtonHint)
### login & password fields
self.username = QLineEdit(self)
self.password = QLineEdit(self)
self.password.setEchoMode(QLineEdit.Password)
loginLayout = QFormLayout()
loginLayout.addRow("Username", self.username)
loginLayout.addRow("Password", self.password)
self.buttons = QDialogButtonBox(QDialogButtonBox.Ok | QDialogButtonBox.Cancel)
self.buttons.accepted.connect(self.control)
self.buttons.rejected.connect(self.reject)
layout = QtWidgets.QVBoxLayout(self)
layout.addLayout(loginLayout)
layout.addWidget(self.buttons)
self.setLayout(layout)
### set window title & stylesheet
self.setWindowTitle('Login Box')
self.setWindowIcon(QtGui.QIcon('dc1.png'))
self.setStyleSheet((qdarkstyle.load_stylesheet_pyqt5()))
###lock resize
self.setSizeGripEnabled(False)
self.setFixedSize(self.sizeHint())
###log by usins sql credentials
def control(self):
ser = ########
base = #########
login = self.username.text()
pwd = self.password.text()
timeout = 5
self.engine = sqlalchemy.create_engine(
"mssql+pyodbc://{username}:{pwd}@10.96.5.17\dqinstance/{dbname}?driver=SQL+Server+Native+Client+11.0".format(
dbname=base, username=login, pwd=pwd), connect_args={'timeout': timeout})
try:
connection = self.engine.connect()
connection.close()
self.accept()
except:
QMessageBox.warning(self, 'Error', "Wrong username or password! \n\n"
"Please use the SQL Server credentials ")
Это выглядит так:
QApp.py
# -- coding: utf-8 --
from PyQt5 import QtCore, QtGui, QtWidgets
from QLogin import LoginDialog
import qdarkstyle
class MainWindow(QtWidgets.QMainWindow):
def __init__(self, parent=None):
super(MainWindow,self).__init__(parent)
self.main_frame()
self.center() #center frame
self.layout_init() #widgets layout
def main_frame(self):
### actions on meenubar
exitAct = QtWidgets.QAction('&Exit', self)
exitAct.setShortcut('Ctrl+Q')
exitAct.setStatusTip('Exit application')
exitAct.triggered.connect(self.close)
self.statusBar()
### menubar
menubar = self.menuBar()
fileMenu = menubar.addMenu('&File')
fileMenu.addAction(exitAct)
fileMenu = menubar.addMenu('&Help')
### basic geometry and color
self.setWindowTitle('Test Window')
self.setWindowIcon(QtGui.QIcon('dc1.png'))
self.setStyleSheet((qdarkstyle.load_stylesheet_pyqt5()))
def layout_init(self):
grid = QtWidgets.QGridLayout()
central_widget = QtWidgets.QWidget()
self.setCentralWidget(central_widget)
### widgets
self.tablewidget = QtWidgets.QTableWidget() #frame
self.textbox = QtWidgets.QLineEdit()
self.textbox.setPlaceholderText('IMEI')
self.textbox.setEnabled(True)
self.textbox.setValidator(QtGui.QDoubleValidator())
self.pb = QtWidgets.QPushButton(self.tr("Run process"))
self.pb.setDisabled(True)
self.textbox.textChanged.connect(self.disableButton)
self.pb.clicked.connect(self.on_clicked)
### make vidgets alive
self.centralWidget().setLayout(grid)
grid.addWidget(self.textbox)
grid.addWidget(self.tablewidget)
grid.addWidget(self.pb)
### center main window
def center(self):
qr = self.frameGeometry()
cp = QtWidgets.QDesktopWidget().availableGeometry().center()
qr.moveCenter(cp)
self.move(qr.topLeft())
def disableButton(self):
if len(self.textbox.text())> 0:
self.pb.setDisabled(False)
else:
self.pb.setDisabled(True)
### run process button
def on_clicked(self):
if len(self.textbox.text())== 0:
pass
else:
print('test')
def sql_query(self):
self.sql = "SELECT " \
"FI.FileNameTransformed, " \
"FI.OrderItemCode, " \
"FIR.Imported," \
"FR.Row " \
"FROM[PROD_WAREX2].[dbo].[FileRows] FR " \
"JOIN[PROD_WAREX2].[dbo].[FileImportRows]FIR ON FR.RowId = FIR.RowId" \
"JOIN[PROD_WAREX2].[dbo].[FileImports] FI ON FIR.FileImportId = FI.Id" \
"WHERE FR.Row LIKE : e1"
self.e1 = '%'&self.textbox.text()&'%'
QMain.py
import sys
from PyQt5.QtWidgets import QApplication
from QLogin import LoginDialog
from QApp import MainWindow
if __name__ == '__main__':
app = QApplication(sys.argv)
login = LoginDialog()
if not login.exec_():
sys.exit(-1)
window = MainWindow()
window.show()
sys.exit(app.exec_())