Python Forum
Displaying database info in QTableWidget
Thread Rating:
  • 0 Vote(s) - 0 Average
  • 1
  • 2
  • 3
  • 4
  • 5
Displaying database info in QTableWidget
#1
I was trying to keep my code somewhat organized and I ran into a slight problem and I'm hoping I won't have to restructure it too much. I have two files. MainWindow and ModuleWindows.

Looking at the ModuleWindows file, currently function SearchHardware() under the Ui_SearchWindow class is setup just for testing pulling data and printing it just disregard for now. The goal for this function though is simple when the user enters a serial number and clicks the search button it will pull that row from the database and display it in the QTableWidget on the MainWindow file.

I'm not exactly sure the best way to go about this or if it's even possible. When SearchHardware() is called, how am I going to get that data to display on the QTableWidget in the MainWindow file?

I feel like since this function isn't being called from the MainWindow and passing the users input as arguments it isn't possible. I'm going to need to throw the Ui_SearchWindow class and SearchWindow() function in the MainWindow file?



MainWindow:
from PyQt5 import QtCore, QtGui, QtWidgets
from ModuleWindows import Ui_NewHardwareWindow
from ModuleWindows import Ui_SearchWindow
import sys


class Ui_MainWindow(object):
    def ShowNewHardwareWindow(self):
        self.window = QtWidgets.QMainWindow()
        self.ui = Ui_NewHardwareWindow()
        self.ui.setupUi(self.window)
        self.window.show()

    def ShowSearchWindow(self):
        self.window = QtWidgets.QMainWindow()
        self.ui = Ui_SearchWindow()
        self.ui.setupUi(self.window)
        self.window.show()

    def SetupUi(self, MainWindow):
        super().__init__()
        MainWindow.setObjectName("MainWindow")
        MainWindow.setWindowTitle("Hardware Inventory")
        MainWindow.setWindowModality(QtCore.Qt.NonModal)
        MainWindow.resize(900, 300)
        MainWindow.setMaximumSize(QtCore.QSize(900, 300))
        MainWindow.setMinimumSize(QtCore.QSize(900, 300))
        MainWindow.setCursor(QtGui.QCursor(QtCore.Qt.PointingHandCursor))
        MainWindow.setTabletTracking(False)
        MainWindow.setAutoFillBackground(False)
        MainWindow.setStyleSheet('')
        MainWindow.setToolButtonStyle(QtCore.Qt.ToolButtonFollowStyle)
        MainWindow.setTabShape(QtWidgets.QTabWidget.Rounded)

        font = QtGui.QFont()
        font.setFamily("MS UI Gothic")
        font.setPointSize(9)

        self.CentralWidget = QtWidgets.QWidget(MainWindow)
        self.CentralWidget.setObjectName("CentralWidget")

        self.TableWidget = QtWidgets.QTableWidget(self.CentralWidget)
        self.TableWidget.setGeometry(QtCore.QRect(120, 10, 770, 300))
        self.TableWidget.setRowCount(5)
        self.TableWidget.setColumnCount(5)
        self.TableWidget.setObjectName("TableWidget")
        item = QtWidgets.QTableWidgetItem()
        self.TableWidget.setHorizontalHeaderItem(0, item)
        item = QtWidgets.QTableWidgetItem()
        self.TableWidget.setHorizontalHeaderItem(1, item)
        item = QtWidgets.QTableWidgetItem()
        self.TableWidget.setHorizontalHeaderItem(2, item)
        item = QtWidgets.QTableWidgetItem()
        self.TableWidget.setHorizontalHeaderItem(3, item)
        item = QtWidgets.QTableWidgetItem()
        self.TableWidget.setHorizontalHeaderItem(4, item)
        item = self.TableWidget.horizontalHeaderItem(0)
        item.setText("Creation Date")
        item = self.TableWidget.horizontalHeaderItem(1)
        item.setText("Last Modified")
        item = self.TableWidget.horizontalHeaderItem(2)
        item.setText("Serial Number")
        item = self.TableWidget.horizontalHeaderItem(3)
        item.setText("Model")
        item = self.TableWidget.horizontalHeaderItem(4)
        item.setText("User")

        self.button_new_hardware = QtWidgets.QPushButton(self.CentralWidget)
        self.button_new_hardware.setText("NEW HARDWARE")
        self.button_new_hardware.setGeometry(QtCore.QRect(10, 10, 101, 31))
        self.button_new_hardware.setFont(font)
        self.button_new_hardware.setLayoutDirection(QtCore.Qt.LeftToRight)
        self.button_new_hardware.setAutoFillBackground(False)
        self.button_new_hardware.setStyleSheet("")
        self.button_new_hardware.setObjectName("button_new_hardware")
        self.button_new_hardware.clicked.connect(self.ShowNewHardwareWindow)

        self.button_search = QtWidgets.QPushButton(self.CentralWidget)
        self.button_search.setGeometry(QtCore.QRect(10, 50, 101, 31))
        self.button_search.setFont(font)
        self.button_search.setObjectName("button_search")
        self.button_search.setText("SEARCH")
        self.button_search.clicked.connect(self.ShowSearchWindow)

        self.button_refresh = QtWidgets.QPushButton(self.CentralWidget)
        self.button_refresh.setGeometry(QtCore.QRect(10, 90, 101, 31))
        self.button_refresh.setFont(font)
        self.button_refresh.setObjectName("button_refresh")
        self.button_refresh.setText('REFRESH')

        self.button_export = QtWidgets.QPushButton(self.CentralWidget)
        self.button_export.setGeometry(QtCore.QRect(10, 130, 101, 31))
        self.button_export.setFont(font)
        self.button_export.setObjectName("button_export")
        self.button_export.setText('EXPORT')

        self.button_viewall = QtWidgets.QPushButton(self.CentralWidget)
        self.button_viewall.setGeometry(QtCore.QRect(10, 170, 101, 31))
        self.button_viewall.setFont(font)
        self.button_viewall.setObjectName("button_viewall")
        self.button_viewall.setText('VIEW ENTIRE DB')

        MainWindow.setCentralWidget(self.CentralWidget)
        self.statusbar = QtWidgets.QStatusBar(MainWindow)
        self.statusbar.setObjectName("statusbar")
        MainWindow.setStatusBar(self.statusbar)


if __name__ == "__main__":
    app = QtWidgets.QApplication(sys.argv)
    window = QtWidgets.QMainWindow()
    ui = Ui_MainWindow()
    ui.SetupUi(window)
    window.show()
    sys.exit(app.exec_())
ModuleWindows:
from PyQt5 import QtCore, QtGui, QtWidgets
import sys
import pyodbc
import datetime


class Ui_NewHardwareWindow(object):
    def setupUi(self, NewHardwareWindow):
        super().__init__()
        NewHardwareWindow.setObjectName("NewHardwareWindow")
        NewHardwareWindow.resize(265, 167)
        NewHardwareWindow.setWindowTitle('NEW HARDWARE')
        NewHardwareWindow.setMinimumSize(265, 167)
        NewHardwareWindow.setMaximumSize(265, 167)

        font_label = QtGui.QFont()
        font_label.setFamily('MS UI Gothic')
        font_label.setPointSize(10)

        font_button = QtGui.QFont()
        font_button.setFamily('MS UI Gothic')
        font_button.setPointSize(9)

        self.centralwidget = QtWidgets.QWidget(NewHardwareWindow)
        self.centralwidget.setObjectName("centralwidget")

        self.label_serialnumber = QtWidgets.QLabel(self.centralwidget)
        self.label_serialnumber.setGeometry(QtCore.QRect(10, 20, 101, 20))
        self.label_serialnumber.setText("SERIAL NUMBER")
        self.label_serialnumber.setFont(font_label)
        self.label_serialnumber.setObjectName("label_serialnumber")

        self.label_model = QtWidgets.QLabel(self.centralwidget)
        self.label_model.setGeometry(QtCore.QRect(10, 50, 91, 16))
        self.label_model.setText('MODEL')
        self.label_model.setFont(font_label)
        self.label_model.setObjectName("label_model")

        self.label_user = QtWidgets.QLabel(self.centralwidget)
        self.label_user.setGeometry(QtCore.QRect(10, 80, 81, 16))
        self.label_user.setText('USER')
        self.label_user.setFont(font_label)
        self.label_user.setObjectName("label_user")

        self.textbox_serialnumber = QtWidgets.QLineEdit(self.centralwidget)
        self.textbox_serialnumber.setGeometry(QtCore.QRect(110, 20, 121, 16))
        self.textbox_serialnumber.setObjectName("textbox_serialnumber")

        self.textbox_model = QtWidgets.QLineEdit(self.centralwidget)
        self.textbox_model.setGeometry(QtCore.QRect(110, 50, 121, 16))
        self.textbox_model.setObjectName("textbox_model")

        self.textbox_username = QtWidgets.QLineEdit(self.centralwidget)
        self.textbox_username.setGeometry(QtCore.QRect(110, 80, 121, 16))
        self.textbox_username.setObjectName("textbox_username")

        self.button_clear = QtWidgets.QPushButton(self.centralwidget)
        self.button_clear.setGeometry(QtCore.QRect(110, 110, 61, 31))
        self.button_clear.setText('CLEAR')
        self.button_clear.setFont(font_button)
        self.button_clear.setObjectName("button_clear")
        self.button_clear.clicked.connect(self.ClearTextBoxes)

        self.button_enter = QtWidgets.QPushButton(self.centralwidget)
        self.button_enter.setGeometry(QtCore.QRect(170, 110, 61, 31))
        self.button_enter.setText('ENTER')
        self.button_enter.setFont(font_button)
        self.button_enter.setObjectName("button_enter")
        self.button_enter.clicked.connect(self.EnterNewHardware)

        self.statusbar = QtWidgets.QStatusBar(NewHardwareWindow)
        self.statusbar.setObjectName("statusbar")

        NewHardwareWindow.setCentralWidget(self.centralwidget)
        NewHardwareWindow.setStatusBar(self.statusbar)

    def EnterNewHardware(self):
        serial_number = self.textbox_serialnumber.text()
        model = self.textbox_model.text()
        user_name = self.textbox_username.text()
        creation_date = datetime.datetime.now().strftime('%m/%d/%y')
        modify_date = datetime.datetime.now().strftime('%m/%d/%y')

        print(creation_date)
        print(modify_date)
        print(serial_number)
        print(model)
        print(user_name)

        azure_server = 'pythonserver5874.database.windows.net'
        azure_db = 'inventoryDatabase'
        azure_username = ''
        password = ''
        driver = '{ODBC Driver 17 for SQL Server}'
        connection_string = f"DRIVER={driver};SERVER={azure_server};PORT=1433;DATABASE={azure_db};UID={azure_username};PWD={password}"

        conn = pyodbc.connect(connection_string)
        cursor = conn.cursor()

        sql_statement = 'INSERT INTO inventoryDatabase.dbo.Hardware(CreationDate, ModifyDate, SerialNumber, Model, Username) ' \
                        'VALUES (?, ?, ?, ?, ?)'

        sql_data = (creation_date, modify_date, serial_number, model, user_name)

        cursor.execute(sql_statement, sql_data)
        conn.commit()
        cursor.commit()

        self.textbox_serialnumber.clear()
        self.textbox_model.clear()
        self.textbox_username.clear()

        self.statusbar.showMessage(serial_number + " has been entered")

    def ClearTextBoxes(self):
        self.textbox_serialnumber.clear()
        self.textbox_model.clear()
        self.textbox_username.clear()


class Ui_SearchWindow(object):
    def setupUi(self, SearchWindow):
        super().__init__()
        SearchWindow.setObjectName("SearchWindow")
        SearchWindow.resize(277, 135)
        SearchWindow.setWindowTitle("SEARCH INVENTORY")

        label_font = QtGui.QFont()
        label_font.setFamily("MS UI GOTHIC")
        label_font.setPointSize(10)

        button_font = QtGui.QFont()
        button_font.setFamily("MS UI GOTHIC")
        button_font.setPointSize(10)

        self.central_widget = QtWidgets.QWidget(SearchWindow)
        self.central_widget.setObjectName("CentralWidget")

        self.label_serialnumber = QtWidgets.QLabel(self.central_widget)
        self.label_serialnumber.setGeometry(QtCore.QRect(10, 20, 111, 20))
        self.label_serialnumber.setFont(label_font)
        self.label_serialnumber.setObjectName("label_serialnumber")
        self.label_serialnumber.setText("SERIAL NUMBER")

        self.label_username = QtWidgets.QLabel(self.central_widget)
        self.label_username.setGeometry(QtCore.QRect(40, 50, 71, 20))
        self.label_username.setFont(label_font)
        self.label_username.setObjectName("label_username")
        self.label_username.setText("USERNAME")

        self.textbox_serialnumber = QtWidgets.QLineEdit(self.central_widget)
        self.textbox_serialnumber.setGeometry(QtCore.QRect(120, 20, 121, 20))
        self.textbox_serialnumber.setObjectName("textbox_serialnumber")

        self.textbox_username = QtWidgets.QLineEdit(self.central_widget)
        self.textbox_username.setGeometry(QtCore.QRect(120, 50, 121, 20))
        self.textbox_username.setObjectName("textbox_username")

        self.button_search = QtWidgets.QPushButton(self.central_widget)
        self.button_search.setGeometry(QtCore.QRect(120, 80, 121, 31))
        self.button_search.setFont(button_font)
        self.button_search.setObjectName("button_search")
        self.button_search.setText("SEARCH")
        self.button_search.clicked.connect(self.SearchHardware)

        SearchWindow.setCentralWidget(self.central_widget)

        self.statusbar = QtWidgets.QStatusBar(SearchWindow)
        self.statusbar.setObjectName("statusbar")

        SearchWindow.setStatusBar(self.statusbar)

    def SearchHardware(self):

        serial_number = self.textbox_serialnumber.text()

        azure_server = 'pythonserver5874.database.windows.net'
        azure_db = 'inventoryDatabase'
        azure_username = ''
        password = '!'
        driver = '{ODBC Driver 17 for SQL Server}'
        connection_string = f"DRIVER={driver};SERVER={azure_server};PORT=1433;DATABASE={azure_db};UID={azure_username};PWD={password}"
        conn = pyodbc.connect(connection_string, serial_number)
        cursor = conn.cursor()

        sql_statement = 'SELECT * FROM inventoryDatabase.dbo.Hardware WHERE SerialNumber LIKE (?)'
        cursor.execute(sql_statement, serial_number)
        cursor.commit()
        conn.commit()
        for row in cursor.fetchall():
            print(row)


if __name__ == "__main__":
    app = QtWidgets.QApplication(sys.argv)
    NewHardwareWindow = QtWidgets.QMainWindow()
    ui = Ui_NewHardwareWindow()
    ui.setupUi(NewHardwareWindow)
    NewHardwareWindow.show()
    sys.exit(app.exec_())
Reply
#2
Your question is boring, so I am going to answer a different question.

Views that need to update to reflect changes in data should have an update method. This update method is bound to a notify event associated with the data. When the data changes it sends notification to all the interested parties. Something like this:
import tkinter as tk

class CallbackList(list):
    """A list of functions to call"""
    def __call__(self, value):
        for func in self:
            func(value)

    def connect(self, func):
        """Add function to the list"""
        self.append(func)

class MyData():
    """This is my data"""
    def __init__(self):
        self.value = 1
        self.value_changed = CallbackList()
    
    def set_value(self, value):
        """Set my data and notify that value changed"""
        self.value = value
        self.value_changed(self.value)

def enter_value(event):
    """Gets called when Retrun key is pressed in entry widget"""
    data.set_value(float(event.widget.get()))

def update_square(value):
    """Call this when value changes"""
    square['text'] = str(value**2)

def update_cube(value):
    """Call this when value changes"""
    cube['text'] = str(value**3)

data = MyData()

root = tk.Tk()
entry = tk.Entry(root, width=4)
entry.pack()
entry.bind('<Return>', enter_value)

square = tk.Label(root, width=4)
square.pack()
data.value_changed.connect(update_square)

cube = tk.Label(root, width=4)
cube.pack()
data.value_changed.connect(update_cube)
root.mainloop()
You want to avoid having one control being directly responsible for changing another control. Try to make each GUI element responsible for doing only one thing, and have that control and associated control do it's job while being as ignorant as possible about other parts of the GUI.

Back to your question. Where code exists should have no affect on if arguments can be passed. If you get something from a database in one file, there is no reason why that information cannot be passed as an argument to a function in a different file that displays the information. I think any limitations you see are not real. You think there is something special about code being in different files. The only thing affected by that are module variables, and you should not be using many of those.
thewolf likes this post
Reply
#3
thanks Deanhystad. I actually rearranged some of the code and got it working. In case anyone is interested in the code see below. The only thing I have left to do is figure out the best way for a user to edit the database data when they search for a piece of hardware. If it was me I would want to be able to double-click a row which would pop open a window with the selected row information, edit it in the separate window and then click an enter button or the enter key and it will update the table display and database. Not sure what I'm going to do with Export button yet. Thought about having it export current table information to an Excel file to be printed. Going to go over my options and see what I can do. Also my credentials will not be hard coded in the final production version.

MainWindow.py
from PyQt5 import QtCore, QtGui, QtWidgets
from NewHardwareWindow import Ui_NewHardwareWindow
import sys
import pyodbc


class Ui_MainWindow(object):
    def SetupUi(self, MainWindow):
        super().__init__()
        MainWindow.setObjectName("MainWindow")
        MainWindow.setWindowTitle("Hardware Inventory")
        MainWindow.setWindowModality(QtCore.Qt.NonModal)
        MainWindow.resize(900, 350)
        MainWindow.setMaximumSize(QtCore.QSize(900, 350))
        MainWindow.setMinimumSize(QtCore.QSize(900, 350))
        MainWindow.setCursor(QtGui.QCursor(QtCore.Qt.PointingHandCursor))
        MainWindow.setTabletTracking(False)
        MainWindow.setAutoFillBackground(False)
        MainWindow.setStyleSheet('')
        MainWindow.setToolButtonStyle(QtCore.Qt.ToolButtonFollowStyle)
        MainWindow.setTabShape(QtWidgets.QTabWidget.Rounded)

        font = QtGui.QFont()
        font.setFamily("MS UI Gothic")
        font.setPointSize(8)

        self.CentralWidget = QtWidgets.QWidget(MainWindow)
        self.CentralWidget.setObjectName("CentralWidget")

        self.TableWidget = QtWidgets.QTableWidget(self.CentralWidget)
        self.TableWidget.setGeometry(QtCore.QRect(120, 10, 770, 340))
        self.TableWidget.setSortingEnabled(True)
        self.TableWidget.setRowCount(0)
        self.TableWidget.setColumnCount(5)
        self.TableWidget.setObjectName("TableWidget")
        item = QtWidgets.QTableWidgetItem()
        self.TableWidget.setHorizontalHeaderItem(0, item)
        item = QtWidgets.QTableWidgetItem()
        self.TableWidget.setHorizontalHeaderItem(1, item)
        item = QtWidgets.QTableWidgetItem()
        self.TableWidget.setHorizontalHeaderItem(2, item)
        item = QtWidgets.QTableWidgetItem()
        self.TableWidget.setHorizontalHeaderItem(3, item)
        item = QtWidgets.QTableWidgetItem()
        self.TableWidget.setHorizontalHeaderItem(4, item)
        item = self.TableWidget.horizontalHeaderItem(0)
        item.setText("Creation Date")
        item = self.TableWidget.horizontalHeaderItem(1)
        item.setText("Last Modified")
        item = self.TableWidget.horizontalHeaderItem(2)
        item.setText("Serial Number")
        item = self.TableWidget.horizontalHeaderItem(3)
        item.setText("Model")
        item = self.TableWidget.horizontalHeaderItem(4)
        item.setText("User")

        self.textbox_search = QtWidgets.QLineEdit(self.CentralWidget)
        self.textbox_search.setGeometry(QtCore.QRect(10, 10, 101, 15))
        self.textbox_search.setObjectName("textbox_model")
        self.textbox_search.setText('')
        self.textbox_search.setFocus()
        self.textbox_search.returnPressed.connect(self.SearchHardware)

        self.button_search = QtWidgets.QPushButton(self.CentralWidget)
        self.button_search.setText("SEARCH")
        self.button_search.setGeometry(QtCore.QRect(10, 30, 101, 18))
        self.button_search.setFont(font)
        self.button_search.setObjectName("button_search")
        self.button_search.clicked.connect(self.SearchHardware)
        self.button_search.setAutoDefault(True)

        self.button_new_hardware = QtWidgets.QPushButton(self.CentralWidget)
        self.button_new_hardware.setText("NEW HARDWARE")
        self.button_new_hardware.setGeometry(QtCore.QRect(10, 60, 101, 31))
        self.button_new_hardware.setFont(font)
        self.button_new_hardware.setObjectName("button_new_hardware")
        self.button_new_hardware.setAutoDefault(True)
        self.button_new_hardware.clicked.connect(self.EnterNewHardwareWindow)

        self.button_viewall = QtWidgets.QPushButton(self.CentralWidget)
        self.button_viewall.setGeometry(QtCore.QRect(10, 100, 101, 31))
        self.button_viewall.setFont(font)
        self.button_viewall.setObjectName("button_viewall")
        self.button_viewall.setText('VIEW ENTIRE DB')
        self.button_viewall.setAutoDefault(True)
        self.button_viewall.clicked.connect(self.ViewAll)

        self.button_export = QtWidgets.QPushButton(self.CentralWidget)
        self.button_export.setGeometry(QtCore.QRect(10, 140, 101, 31))
        self.button_export.setFont(font)
        self.button_export.setObjectName("button_export")
        self.button_export.setText('EXPORT')

        MainWindow.setCentralWidget(self.CentralWidget)
        self.statusbar = QtWidgets.QStatusBar(MainWindow)
        self.statusbar.setObjectName("statusbar")
        MainWindow.setStatusBar(self.statusbar)

    def EnterNewHardwareWindow(self):
        self.window = QtWidgets.QMainWindow()
        self.ui = Ui_NewHardwareWindow()
        self.ui.setupUi(self.window)
        self.window.show()

    def SearchHardware(self):
        user_search = self.textbox_search.text()
        azure_server = 'pythonserver5874.database.windows.net'
        azure_db = 'inventoryDatabase'
        azure_username = ''
        password = ''
        driver = '{ODBC Driver 17 for SQL Server}'
        connection_string = f"DRIVER={driver};SERVER={azure_server};PORT=1433;DATABASE={azure_db};UID={azure_username};PWD={password}"
        conn = pyodbc.connect(connection_string)
        cursor = conn.cursor()
        sql_statement = '''SELECT CreationDate, ModifyDate, SerialNumber, Model, Username FROM inventoryDatabase.dbo.Hardware WHERE SerialNumber = (?) OR Model = (?) OR Username = (?);'''
        result = cursor.execute(sql_statement, user_search, user_search, user_search)

        self.TableWidget.setRowCount(0)

        for row_number, row_data in enumerate(result):
            self.TableWidget.insertRow(row_number)
            for column_number, data in enumerate(row_data):
                self.TableWidget.setItem(row_number, column_number, QtWidgets.QTableWidgetItem(str(data)))

    def ViewAll(self):
        azure_server = 'pythonserver5874.database.windows.net'
        azure_db = 'inventoryDatabase'
        azure_username = ''
        password = ''
        driver = '{ODBC Driver 17 for SQL Server}'
        connection_string = f"DRIVER={driver};SERVER={azure_server};PORT=1433;DATABASE={azure_db};UID={azure_username};PWD={password}"
        conn = pyodbc.connect(connection_string)
        cursor = conn.cursor()
        sql_statement = '''SELECT CreationDate, ModifyDate, SerialNumber, Model, Username FROM inventoryDatabase.dbo.Hardware'''
        result = cursor.execute(sql_statement)

        self.TableWidget.setRowCount(0)

        for row_number, row_data in enumerate(result):
            self.TableWidget.insertRow(row_number)
            for column_number, data in enumerate(row_data):
                self.TableWidget.setItem(row_number, column_number, QtWidgets.QTableWidgetItem(str(data)))


if __name__ == "__main__":
    app = QtWidgets.QApplication(sys.argv)
    window = QtWidgets.QMainWindow()
    ui = Ui_MainWindow()
    ui.SetupUi(window)
    window.show()
    sys.exit(app.exec_())
NewHardwareWindow.py
from PyQt5 import QtCore, QtGui, QtWidgets
import pyodbc
import datetime


class Ui_NewHardwareWindow(object):
    def setupUi(self, NewHardwareWindow):
        super().__init__()
        NewHardwareWindow.setObjectName("NewHardwareWindow")
        NewHardwareWindow.resize(265, 167)
        NewHardwareWindow.setWindowTitle('NEW HARDWARE')
        NewHardwareWindow.setMinimumSize(265, 167)
        NewHardwareWindow.setMaximumSize(265, 167)

        font_label = QtGui.QFont()
        font_label.setFamily('MS UI Gothic')
        font_label.setPointSize(10)

        font_button = QtGui.QFont()
        font_button.setFamily('MS UI Gothic')
        font_button.setPointSize(9)

        self.centralwidget = QtWidgets.QWidget(NewHardwareWindow)
        self.centralwidget.setObjectName("centralwidget")

        self.label_serialnumber = QtWidgets.QLabel(self.centralwidget)
        self.label_serialnumber.setGeometry(QtCore.QRect(10, 20, 101, 20))
        self.label_serialnumber.setText("SERIAL NUMBER")
        self.label_serialnumber.setFont(font_label)
        self.label_serialnumber.setObjectName("label_serialnumber")

        self.label_model = QtWidgets.QLabel(self.centralwidget)
        self.label_model.setGeometry(QtCore.QRect(10, 50, 91, 16))
        self.label_model.setText('MODEL')
        self.label_model.setFont(font_label)
        self.label_model.setObjectName("label_model")

        self.label_user = QtWidgets.QLabel(self.centralwidget)
        self.label_user.setGeometry(QtCore.QRect(10, 80, 81, 16))
        self.label_user.setText('USER')
        self.label_user.setFont(font_label)
        self.label_user.setObjectName("label_user")

        self.textbox_serialnumber = QtWidgets.QLineEdit(self.centralwidget)
        self.textbox_serialnumber.setGeometry(QtCore.QRect(110, 20, 121, 16))
        self.textbox_serialnumber.setObjectName("textbox_serialnumber")
        self.textbox_serialnumber.returnPressed.connect(self.EnterNewHardware)

        self.textbox_model = QtWidgets.QLineEdit(self.centralwidget)
        self.textbox_model.setGeometry(QtCore.QRect(110, 50, 121, 16))
        self.textbox_model.setObjectName("textbox_model")
        self.textbox_model.returnPressed.connect(self.EnterNewHardware)

        self.textbox_username = QtWidgets.QLineEdit(self.centralwidget)
        self.textbox_username.setGeometry(QtCore.QRect(110, 80, 121, 16))
        self.textbox_username.setObjectName("textbox_username")
        self.textbox_username.returnPressed.connect(self.EnterNewHardware)

        self.button_clear = QtWidgets.QPushButton(self.centralwidget)
        self.button_clear.setGeometry(QtCore.QRect(110, 110, 61, 31))
        self.button_clear.setText('CLEAR')
        self.button_clear.setFont(font_button)
        self.button_clear.setObjectName("button_clear")
        self.button_clear.clicked.connect(self.ClearTextBoxes)

        self.button_enter = QtWidgets.QPushButton(self.centralwidget)
        self.button_enter.setGeometry(QtCore.QRect(170, 110, 61, 31))
        self.button_enter.setText('ENTER')
        self.button_enter.setFont(font_button)
        self.button_enter.setObjectName("button_enter")
        self.button_enter.clicked.connect(self.EnterNewHardware)
        self.button_enter.setAutoDefault(True)

        self.statusbar = QtWidgets.QStatusBar(NewHardwareWindow)
        self.statusbar.setObjectName("statusbar")

        NewHardwareWindow.setCentralWidget(self.centralwidget)
        NewHardwareWindow.setStatusBar(self.statusbar)

    def EnterNewHardware(self):
        serial_number = self.textbox_serialnumber.text()
        model = self.textbox_model.text()
        user_name = self.textbox_username.text()
        creation_date = datetime.datetime.now().strftime('%m/%d/%y')
        modify_date = datetime.datetime.now().strftime('%m/%d/%y')

        print(creation_date)
        print(modify_date)
        print(serial_number)
        print(model)
        print(user_name)

        azure_server = 'pythonserver5874.database.windows.net'
        azure_db = 'inventoryDatabase'
        azure_username = ''
        password = ''
        driver = '{ODBC Driver 17 for SQL Server}'
        connection_string = f"DRIVER={driver};SERVER={azure_server};PORT=1433;DATABASE={azure_db};UID={azure_username};PWD={password}"

        conn = pyodbc.connect(connection_string)
        cursor = conn.cursor()

        sql_statement = 'INSERT INTO inventoryDatabase.dbo.Hardware(CreationDate, ModifyDate, SerialNumber, Model, Username) ' \
                        'VALUES (?, ?, ?, ?, ?)'

        sql_data = (creation_date, modify_date, serial_number, model, user_name)

        if self.textbox_serialnumber.text() == "":
            self.statusbar.showMessage("Enter serial number")
        elif self.textbox_model.text() == "":
            self.statusbar.showMessage("Enter model")
        elif self.textbox_username.text() == "":
            self.statusbar.showMessage("Enter username")
        else:
            cursor.execute(sql_statement, sql_data)
            conn.commit()
            cursor.commit()

            self.textbox_serialnumber.clear()
            self.textbox_model.clear()
            self.textbox_username.clear()
            self.statusbar.showMessage(serial_number + " has been entered")
            self.textbox_serialnumber.setFocus()

    def ClearTextBoxes(self):
        self.textbox_serialnumber.clear()
        self.textbox_model.clear()
        self.textbox_username.clear()
Reply
#4
I think it a little odd that your Ui_NewHardwareWindow and Ui_MainWindow classes are not windows.
Reply
#5
They are windows? As of right now they are the only two windows I have in the app atm. You click the New Hardware button on the main window and it opens the newhardware window.
Reply
#6
They are not windows. They are classes that put stuff in a window. I see this done in tkinter a lot, probably because tkinter does strange things like initialize tkinter and create a window at the same time (Tk()). In Qt I am more used to seeing a window class which is a subclass of a Qt class. Such as class MyMainWindow(qtwidgets.QMainWindow).

If Ui_MainWindow was a window you would not be doing this:
class Ui_MainWindow(object):
    def SetupUi(self, MainWindow):
        super().__init__()
        MainWindow.setObjectName("MainWindow")
        MainWindow.setWindowTitle("Phreesia Hardware")
        MainWindow.setWindowModality(QtCore.Qt.NonModal)
        MainWindow.resize(900, 350)
...
    window = QtWidgets.QMainWindow()
    ui = Ui_MainWindow()2
    ui.SutupUi(window)
Instead your program would look more like this:
class Ui_MainWindow(QtWidgets.QMainWindow):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.setWindowModality(QtCore.Qt.NonModal)
        self.resize(900, 350)
...
    ui = Ui_MainWindow()
    ui.setObjectName("MainWindow")
    ui.setWindowTitle("Phreesia Hardware")
Differences are subtle, but making the UI_MainWindow class a window means it understands all the commands you can send to a window. I moved setObjectName and setWindowTitle out of the Ui_MainWindow class because now I can make two of these windows if I want and assign them different titles and give them different names.
thewolf likes this post
Reply
#7
Oh okay I get what you're saying. This is the 3rd time rewriting this app because I figured out a better way of doing something so it's possible I may end up doing it again.


Curious. Would you say my code is clean, readable?
Reply


Possibly Related Threads…
Thread Author Replies Views Last Post
  PyQt5 form not displaying my data from SQLite3 Database Linuxdesire 2 4,987 Jan-10-2023, 09:51 PM
Last Post: gradlon93
  [PyQt] [Solved]Help displaying SQLite Database Extra 9 2,761 May-21-2022, 08:03 PM
Last Post: Extra
  [PyQt] QTableWidget print problem JokerSob 8 4,789 Jan-28-2022, 06:08 PM
Last Post: Axel_Erfurt
  [PyQt] How do I display the DB table I will choose from the QComboBox in QTableWidget JokerSob 2 2,322 Aug-05-2021, 03:00 PM
Last Post: JokerSob
  [PyQt] Help: check content of combobox in horizontal header of QTableWidget mart79 1 3,366 Jul-26-2020, 06:18 PM
Last Post: deanhystad
  [PyQt] Add validation (regex) to QTableWidget cells mart79 0 2,752 May-05-2020, 12:51 PM
Last Post: mart79
  [Tkinter] Displaying Data from a database and run a function when clicked? PythonNPC 1 2,070 Mar-11-2020, 08:16 PM
Last Post: Larz60+
  [PyQt] QTableWidget stylesheet error mart79 3 6,450 Feb-26-2020, 04:54 PM
Last Post: Denni
  [PyQt] Pyqt5: How do you make a button that adds new row with data to a Qtablewidget YoshikageKira 6 7,024 Jan-02-2020, 04:32 PM
Last Post: Denni
  [PyQt] QTableWidget cell validation littleGreenDude 1 7,685 Jan-18-2019, 07:44 PM
Last Post: littleGreenDude

Forum Jump:

User Panel Messages

Announcements
Announcement #1 8/1/2020
Announcement #2 8/2/2020
Announcement #3 8/6/2020