0

Is it possible to make shorter code? I have 40 buttons: 20 route to one page of widget, next 20 route to another page... But each button triggered other action (opening a file, with iterated name of file: prog1.txt, prog2.txt, prog3.txt, etc...

self.ui.prog_btn_1.clicked.connect(self.show_job_program_page)
        self.ui.prog_btn_1.clicked.connect(self.click_prog1)

        self.ui.prog_btn_2.clicked.connect(self.show_job_program_page)
        self.ui.prog_btn_2.clicked.connect(self.click_prog2)

        self.ui.prog_btn_3.clicked.connect(self.show_job_program_page)
        self.ui.prog_btn_3.clicked.connect(self.click_prog3)
# Etc...

I'll make something like this: If you click button prog_btn_1, open file prog1.txt, I want to avoid duplication of iterated name of functions and files.

eyllanesc
  • 235,170
  • 19
  • 170
  • 241
Wuwu
  • 15
  • 4

1 Answers1

0

You can have a look at something like this for inspiration. I don't know how the rest of the code looks so I put some checkboxes to illustrate it:

import sys
from PyQt5 import QtWidgets as qtw


class MainWindow(qtw.QWidget):
    def __init__(self):
        super().__init__()
        self.setLayout(qtw.QVBoxLayout())
        self.checkbox_dict = dict()
        self.button_dict = dict()
        for i in range(0, 10):
            checkbox = qtw.QCheckBox(self, text='Checkbox' + str(i))
            self.layout().addWidget(checkbox)
            self.checkbox_dict[i] = checkbox
            button = qtw.QPushButton(self, text='PushButton' + str(i))
            self.layout().addWidget(button)
            self.button_dict[i] = button

        for i, button in enumerate(self.button_dict.values()):
            button.clicked.connect(lambda _, i=i: self.click_checkbox(i))

        self.show()

    def click_checkbox(self, i):
        self.checkbox = self.checkbox_dict[i]
        self.checkbox_state = self.checkbox.isChecked()
        self.checkbox.setChecked(not self.checkbox_state)


if __name__ == '__main__':
    app = qtw.QApplication(sys.argv)
    w = MainWindow()
    sys.exit(app.exec())

Also check this thread for explanations for the lambda function

LittleFoxyFox
  • 135
  • 1
  • 1
  • 11