Example #1
0
class Table(QWidget):
    def __init__(self):
        super().__init__()
        self.title = 'grafiko_kreator'
        self.left = 20
        self.top = 50
        self.width = 2600
        self.height = 1000
        self.number_of_hours = 0
        self.number_of_days = QDate.daysInMonth(QDate.currentDate())
        self.workers_number = 3
        self.slaveowners_number = 3
        self.sunday_dates = []
        self.date_box = QDateEdit()
        self.date = QDate.currentDate()
        self.initUI()

    def initUI(self):
        self.setWindowTitle(self.title)
        self.setGeometry(self.left, self.top, self.width, self.height)

        self.createTable()
        self.askfordate()
        self.number_of_wokers()
        self.number_of_slaveowners()
        self.update_table_button()
        self.workers_label()
        self.slaveowners_label()
        # Add box layout, add table to box layout and add box layout to widget
        self.Vlayout = QVBoxLayout()
        self.Hlayout = QHBoxLayout()

        self.Vlayout.addWidget(self.tableWidget)
        self.Vlayout.addLayout(self.Hlayout)
        self.Hlayout.addWidget(self.workers_box)
        self.Hlayout.addWidget(self.w_label)
        self.Hlayout.addWidget(self.slaveowners_box)
        self.Hlayout.addWidget(self.s_label)
        self.Hlayout.addWidget(self.update_button)
        self.Hlayout.addWidget(self.update_button)
        self.Vlayout.addWidget(self.date_box)
        self.setLayout(self.Vlayout)
        self.tableWidget.itemChanged.connect(self.isLast)
        # Show widget
        self.show()

    def createTable(self):
        # Create table
        number_of_rows = self.slaveowners_number + self.workers_number + 1
        number_of_columns = self.number_of_days + 2
        date = self.date
        self.tableWidget = QTableWidget()
        self.tableWidget.setRowCount(number_of_rows)
        self.tableWidget.setColumnCount(number_of_columns)
        horizontal_labels = []
        vertical_labels = []
        horizontal_labels.append('Pracownik/dzień')
        vertical_labels.append('')

        for i in range(number_of_columns - 2):
            horizontal_labels.append(str(i + 1))
        for i in range(number_of_columns):
            vertical_labels.append(str(i + 1))
        horizontal_labels.append('suma')
        self.tableWidget.setHorizontalHeaderLabels(horizontal_labels)
        self.tableWidget.setVerticalHeaderLabels(vertical_labels)
        for i in range(number_of_rows):
            self.tableWidget.setRowHeight(i, 20)
        for i in range(number_of_columns):
            self.tableWidget.setColumnWidth(i, 80)
        self.tableWidget.move(0, 0)

        # table selection change
        for i in range(1, self.number_of_days + 1):
            date.setDate(date.year(), date.month(), i)
            self.tableWidget.setItem(
                0, i, QTableWidgetItem(QDate.shortDayName(date.dayOfWeek())))
            # print(QDate.longDayName(date.dayOfWeek()))
        self.tableWidget.resizeColumnToContents(0)
        self.tableWidget.resizeRowsToContents()
        self.sundays()
        self.how_many_hours()
        self.count()

        self.show()

    def sundays(self):
        number_of_rows = self.slaveowners_number + self.workers_number + 1
        self.sunday_dates = []
        current_day_number = 0
        self.tableWidget.selectRow(0)
        for currentQTableWidgetItem in self.tableWidget.selectedItems():
            current_day_number += 1
            if currentQTableWidgetItem.text() == 'niedz.':
                self.sunday_dates.append(current_day_number)
        for j in range(len(self.sunday_dates) - 1):
            for i in range(number_of_rows):
                self.tableWidget.setItem(i + 1, self.sunday_dates[j],
                                         QTableWidgetItem("x"))

    def change_item(self, row, column, value):
        if value != 'y':
            self.tableWidget.setItem(row, column, QTableWidgetItem(str(value)))
        elif value == 'y':
            self.tableWidget.setItem(row, column, QTableWidgetItem(str(11.5)))
            self.tableWidget.item(row, column).setBackground(
                QtGui.QColor(255, 0, 0))

    def number_of_wokers(self):
        self.workers_box = QLineEdit()
        self.workers_box.setMaximumWidth(200)

    def number_of_slaveowners(self):
        self.slaveowners_box = QLineEdit()
        self.slaveowners_box.setMaximumWidth(200)

    def update_table_button(self):
        self.update_button = QPushButton('update')
        self.update_button.setMaximumWidth(200)

    def workers_label(self):
        self.w_label = QLabel('Ile pracowników')

    def slaveowners_label(self):
        self.s_label = QLabel('ile prowadzących zmiany')

    def askfordate(self):
        self.date_box.setDate(QDate.currentDate())
        self.date_box.setMaximumSize(200, 50)
        self.date_box.move(0, 300)
        self.date_box.show()
        self.date_box.setCalendarPopup(True)
        # self.date_box.dateChanged.connect(self.createTable)

    def how_many_hours(self):
        hours_count = 0
        working_date = self.date
        for i in range(working_date.daysInMonth()):
            working_date.setDate(working_date.year(), working_date.month(),
                                 i + 1)
            if working_date.dayOfWeek() > 0 and working_date.dayOfWeek() < 6:
                hours_count += 8
        self.number_of_hours = hours_count

    @pyqtSlot()
    def isLast(self):
        try:
            self.tableWidget.currentItem().setBackground(
                QtGui.QColor(255, 255, 255))
            column = self.tableWidget.currentItem().column()
            if column == self.number_of_days + 1:
                pass
            else:
                self.count()
        except:
            column = self.tableWidget.currentColumn()
            pass

    def count(self):
        for row in range(self.slaveowners_number + self.workers_number):
            suma = 0
            for column in range(self.number_of_days):
                try:
                    suma += float(
                        self.tableWidget.item(row + 1, column + 1).text())
                except:
                    pass
            self.tableWidget.selectColumn(column + 2)
            self.tableWidget.setItem(row + 1, column + 2,
                                     QTableWidgetItem(str(suma)))


#
# if __name__ == '__main__':
#     app = QApplication(sys.argv)
#     ex = Table()
#     sys.exit(app.exec_())
class App(QWidget):

    def __init__(self):
        super().__init__()
        self.title = 'grafiko_kreator'
        self.left = 20
        self.top = 50
        self.width = 2600
        self.height = 1000
        self.number_of_hours = 0
        self.number_of_days = QDate.daysInMonth(QDate.currentDate())
        self.workers_number = 3
        self.slaveowners_number = 3
        self.date_box = QDateEdit()
        self.date = QDate.currentDate()
        self.initUI()


    def initUI(self):
        self.setWindowTitle(self.title)
        self.setGeometry(self.left, self.top, self.width, self.height)

        self.createTable()
        self.askfordate()
        self.number_of_wokers()
        self.number_of_slaveowners()
        self.update_table_button()
        self.workers_label()
        self.slaveowners_label()
        # Add box layout, add table to box layout and add box layout to widget
        self.Vlayout = QVBoxLayout()
        self.Hlayout = QHBoxLayout()

        self.Vlayout.addWidget(self.tableWidget)
        self.Vlayout.addLayout(self.Hlayout)
        self.Hlayout.addWidget(self.workers_box)
        self.Hlayout.addWidget(self.w_label)
        self.Hlayout.addWidget(self.slaveowners_box)
        self.Hlayout.addWidget(self.s_label)
        self.Hlayout.addWidget(self.update_button)
        self.Hlayout.addWidget(self.update_button)
        self.Vlayout.addWidget(self.date_box)
        self.setLayout(self.Vlayout)

        # Show widget
        self.show()

    def createTable(self):
        # Create table
        number_of_rows = self.slaveowners_number + self.workers_number+1
        number_of_columns = self.number_of_days+2
        date = self.date
        self.tableWidget = QTableWidget()
        self.tableWidget.setRowCount(number_of_rows)
        self.tableWidget.setColumnCount(number_of_columns)
        horizontal_labels = []
        vertical_labels = []
        horizontal_labels.append('Pracownik/dzień')
        vertical_labels.append('')
        sunday_dates = []
        current_day_number = 0
        for i in range (number_of_columns-2):
            horizontal_labels.append(str(i+1))
        for i in range (number_of_columns):
            vertical_labels.append(str(i+1))
        horizontal_labels.append('suma')
        self.tableWidget.setHorizontalHeaderLabels(horizontal_labels)
        self.tableWidget.setVerticalHeaderLabels(vertical_labels)
        for i in range (number_of_rows):
            self.tableWidget.setRowHeight(i,20)
        for i in range (number_of_columns):
            self.tableWidget.setColumnWidth(i,80)
        self.tableWidget.move(0, 0)

        # table selection change
        for i in range(1,self.number_of_days+1):
            date.setDate(date.year(),date.month(),i)
            self.tableWidget.setItem(0,i,QTableWidgetItem(QDate.shortDayName(date.dayOfWeek())))
            #print(QDate.longDayName(date.dayOfWeek()))
        self.tableWidget.doubleClicked.connect(self.on_click)
        self.tableWidget.resizeColumnToContents(0)
        self.tableWidget.resizeRowsToContents()
        self.tableWidget.selectRow(0)
        for currentQTableWidgetItem in self.tableWidget.selectedItems():
            current_day_number +=1
            if currentQTableWidgetItem.text() == 'niedz.':
                sunday_dates.append(current_day_number)
        for j in range (len(sunday_dates)-1):
            for i in range (number_of_rows):
                self.tableWidget.setItem(i+1,sunday_dates[j],QTableWidgetItem("x"))

        self.tableWidget.itemChanged.connect(self.isLast)
        self.how_many_hours()
        self.give_full_hours()
        self.show()

    def number_of_wokers(self):
        self.workers_box = QLineEdit()
        self.workers_box.setMaximumWidth(200)


    def number_of_slaveowners(self):
        self.slaveowners_box = QLineEdit()
        self.slaveowners_box.setMaximumWidth(200)

    def update_table_button(self):
        self.update_button = QPushButton('update')
        self.update_button.setMaximumWidth(200)
        self.update_button.clicked.connect(self.update_rows)

    def workers_label(self):
        self.w_label = QLabel('Ile pracowników')

    def slaveowners_label(self):
        self.s_label = QLabel('ile prowadzących zmiany')

    def askfordate(self):
        self.date_box.setDate(QDate.currentDate())
        self.date_box.setMaximumSize(200,50)
        self.date_box.move(0,300)
        self.date_box.show()
        self.date_box.setCalendarPopup(True)
        self.date_box.dateChanged.connect(self.update_date)
        #self.date_box.dateChanged.connect(self.createTable)

    def how_many_hours(self):
        hours_count = 0
        working_date = self.date
        for i in range (working_date.daysInMonth()):
            working_date.setDate(working_date.year(), working_date.month(), i+1)
            if working_date.dayOfWeek()>0 and working_date.dayOfWeek()<6:
                hours_count+=8
        print(hours_count)
        self.number_of_hours = hours_count

    def give_free_days(self):
        propability_table = []
        for i in range(self.number_of_days):
            for j in range(self.slaveowners_number+self.workers_number):
                try:
                    if self.tableWidget.item(i,j).text()=='x':
                        propability_table.append(1)
                except:
                    pass
        


    def give_full_hours(self):
        for i in range(self.workers_number+self.slaveowners_number):
            hours_for_person = self.number_of_hours
            number_of_free_days = self.number_of_days-int(round(hours_for_person/11.5,0))
            assigned_free_days = 0
            j=0
            # for j in range(self.number_of_days):
            while hours_for_person > 0 and assigned_free_days<number_of_free_days:
                two_free = False
                two_work = False
                try:
                    two_free = (self.tableWidget.item(i + 1, j - 1).text() == self.tableWidget.item(i + 1, j).text()=='x')
                    two_work = (self.tableWidget.item(i + 1, j - 1).text() == self.tableWidget.item(i + 1, j).text()=='11.5')
                except:
                    pass
                try:

                    if (self.tableWidget.item(i+1,j+1).text())=='x' and assigned_free_days-number_of_free_days!=0:
                        assigned_free_days+=1
                        j+=1
                    else:
                        j+=1
                except:
                    is_ramdomly_free = random.random() < (number_of_free_days-assigned_free_days)/((self.number_of_days-j)+np.power(10.0,-100))
                    if is_ramdomly_free and assigned_free_days-number_of_free_days!=0 and not two_free or two_work:
                        self.tableWidget.setItem(i+1,j+1,QTableWidgetItem(str('x')))
                        j+=1
                        assigned_free_days+=1
                    elif self.is_enough_today(j+1) and assigned_free_days-number_of_free_days!=0 and not two_free or two_work:
                        self.tableWidget.setItem(i + 1, j + 1, QTableWidgetItem(str('x')))
                        j+=1
                        assigned_free_days+=1
                    elif not self.is_enough_today(j+1):
                        self.tableWidget.setItem(i+1,j+1,QTableWidgetItem(str(11.5)))
                        hours_for_person-=11.5
                        j+=1
                    else:
                        self.tableWidget.setItem(i + 1, j + 1, QTableWidgetItem(str('x')))
                        j += 1
                        assigned_free_days += 1
            self.tableWidget.setItem(i+1,j,QTableWidgetItem(str(hours_for_person)))
        self.isLast()

    def is_enough_today(self,day):
        number_of_todays_workers = 0
        for i in range (self.slaveowners_number+self.workers_number):
            try:
                if self.tableWidget.item(i,day).text()=='11.5':
                    number_of_todays_workers+=1
            except:
                pass
        return number_of_todays_workers > 2

    @pyqtSlot()
    def isLast(self):
        try:
            column = self.tableWidget.currentItem().column()
            if column == self.number_of_days+1:
                pass
            else:
                self.count()
        except:
            pass
    def on_click(self):
        print("\n")
        for currentQTableWidgetItem in self.tableWidget.selectedItems():
            print(currentQTableWidgetItem.row(), currentQTableWidgetItem.column(), currentQTableWidgetItem.text())

    def update_rows(self):
        self.slaveowners_number = int(self.slaveowners_box.text())
        self.workers_number = int(self.workers_box.text())
        rows = self.slaveowners_number+self.workers_number
        difference = self.tableWidget.rowCount()-(rows+2)
        for i in range(abs(difference+1)):
            if (difference<0):
                self.tableWidget.insertRow(i+1)
            if (difference>0):
                self.tableWidget.removeRow(self.tableWidget.rowCount()-1)
        vertical_labels = []
        vertical_labels.append('')
        for i in range(rows):
            vertical_labels.append(str(i + 1))

        self.tableWidget.setVerticalHeaderLabels(vertical_labels)
        self.tableWidget.resizeRowsToContents()

    def count(self):
        suma = 0

        row = self.tableWidget.currentItem().row()
        #print(type(int(self.tableWidget.currentItem().text())))
        for i in range(self.number_of_days+1):
            try:
                 suma+=float(self.tableWidget.item(row,i).text())

            except:
                pass
        try:
            self.tableWidget.selectColumn(self.number_of_days+1)
            self.tableWidget.setItem(row,self.number_of_days+1,QTableWidgetItem(str(suma)))
        except:
            pass
        # self.tableWidget.setItem(row,self.number_of_days,QTableWidgetItem(suma))

    def update_date(self):
        current_day_number = 0
        sunday_dates = []
        days = QDate.daysInMonth(self.date_box.date())
        columns = days+1
        number_of_rows = self.workers_number+self.slaveowners_number
        self.date=self.date_box.date()
        date = self.date
        difference = self.number_of_days-(days)
        for i in range(abs(difference)):
            if (difference<0):
                print(difference)
                self.tableWidget.insertColumn(i)
            if (difference>0):
                print(difference)
                self.tableWidget.removeColumn(days-i)
        self.number_of_days = days
        self.tableWidget.clear()

        horizontal_labels = []
        horizontal_labels.append('Pracownik/dzień')
        for i in range(days):
            horizontal_labels.append(str(i + 1))
        horizontal_labels.append('suma')
        self.tableWidget.setHorizontalHeaderLabels(horizontal_labels)
        for i in range(self.tableWidget.rowCount()):
            self.tableWidget.setRowHeight(i, 20)
        for i in range(days+1):
            self.tableWidget.setColumnWidth(i, 80)
        for i in range(1, days+1):
           date.setDate(date.year(), date.month(), i)
           self.tableWidget.setItem(0, i, QTableWidgetItem(QDate.shortDayName(date.dayOfWeek())))

        self.tableWidget.selectRow(0)
        for currentQTableWidgetItem in self.tableWidget.selectedItems():
            current_day_number += 1
            if currentQTableWidgetItem.text() == 'niedz.':
                sunday_dates.append(current_day_number)
        for j in range(len(sunday_dates) - 1):
            for i in range(number_of_rows):
                self.tableWidget.setItem(i + 1, sunday_dates[j], QTableWidgetItem("x"))
        self.tableWidget.resizeColumnToContents(0)
        self.tableWidget.resizeRowsToContents()
        self.how_many_hours()
        self.show()