class ForecastSingleDouble(QMainWindow):
    def __init__(self):
        super().__init__()

        # 开奖号码部分
        # 标签部分
        self.label_lottery_number = QLabel(r'开奖号码', self)
        self.label_lottery_wan = QLabel(r'万位', self)
        self.label_lottery_thousand = QLabel(r'千位', self)
        self.label_lottery_hundred = QLabel(r'百位', self)
        self.label_lottery_ten = QLabel(r'十位', self)
        self.label_lottery_unit = QLabel(r'个位', self)
        # 输入文本框部分
        self.lineEdit_lottery_wan = QLineEdit(self)
        self.lineEdit_lottery_thousand = QLineEdit(self)
        self.lineEdit_lottery_hundred = QLineEdit(self)
        self.lineEdit_lottery_ten = QLineEdit(self)
        self.lineEdit_lottery_unit = QLineEdit(self)
        # 获取开奖号码按钮部分
        self.pushButton_get_lottery_number = QPushButton(r'获取开奖号码', self)

        # 预测号码部分
        # 预测位数标签
        self.label_forecast_wan = QLabel(r'万位单双', self)
        self.label_forecast_thousand = QLabel(r'千位单双', self)
        self.label_forecast_hundred = QLabel(r'百位单双', self)
        self.label_forecast_ten = QLabel(r'十位单双', self)
        self.label_forecast_unit = QLabel(r'个位单双', self)

        # 预测单双的标签
        # 万位预测单双
        self.label_forecast_wan_single = QLabel(r'单', self)
        self.label_forecast_wan_double = QLabel(r'双', self)
        # 千位预测单双
        self.label_forecast_thousand_single = QLabel(r'单', self)
        self.label_forecast_thousand_double = QLabel(r'双', self)
        # 百位预测单双
        self.label_forecast_hundred_single = QLabel(r'单', self)
        self.label_forecast_hundred_double = QLabel(r'双', self)
        # 十位预测单双
        self.label_forecast_ten_single = QLabel(r'单', self)
        self.label_forecast_ten_double = QLabel(r'双', self)
        # 个位预测单双
        self.label_forecast_unit_single = QLabel(r'单', self)
        self.label_forecast_unit_double = QLabel(r'双', self)

        # 预测准确率的输入文本框
        # 万位预测号码
        self.lineEdit_forecast_wan_single_ratio = QLineEdit(self)
        self.lineEdit_forecast_wan_double_ratio = QLineEdit(self)
        # 千位预测号码
        self.lineEdit_forecast_thousand_single_ratio = QLineEdit(self)
        self.lineEdit_forecast_thousand_double_ratio = QLineEdit(self)
        # 百位预测号码
        self.lineEdit_forecast_hundred_single_ratio = QLineEdit(self)
        self.lineEdit_forecast_hundred_double_ratio = QLineEdit(self)
        # 十位预测号码
        self.lineEdit_forecast_ten_single_ratio = QLineEdit(self)
        self.lineEdit_forecast_ten_double_ratio = QLineEdit(self)
        # 个位预测号码
        self.lineEdit_forecast_unit_single_ratio = QLineEdit(self)
        self.lineEdit_forecast_unit_double_ratio = QLineEdit(self)
        # 预测号码按钮
        self.pushButton_forecast_single_double = QPushButton(r'预测开奖单双', self)

        # 在线投注部分
        # 标签部分
        self.label_website = QLabel(r'购彩网址', self)
        self.label_user_name = QLabel(r'用户名', self)
        self.label_user_password = QLabel(r'密码', self)
        self.label_start_money = QLabel(r'初始资金', self)
        self.label_stop_money = QLabel(r'止损金额', self)
        self.label_current_lottery_time = QLabel(r'当前投注倍数', self)
        self.label_current_lottery_money = QLabel(r'当前投注金额', self)
        self.label_history_max_wrong_time = QLabel(r'最单错误次数', self)
        self.label_history_max_lottery_money = QLabel(r'最单投注金额', self)
        self.label_profit_money = QLabel(r'当前盈利金额', self)

        self.label_lottery_bet_mode = QLabel(r'投注模式', self)
        self.label_lottery_risk_mode = QLabel(r'风险模式', self)
        self.label_lottery_follow_mode = QLabel(r'跟号模式', self)
        self.label_lottery_buy_number_mode = QLabel(r'购号模式', self)

        # 输入文本框
        self.lineEdit_website = QLineEdit(self)
        self.lineEdit_user_name = QLineEdit(self)
        self.lineEdit_user_password = QLineEdit(self)
        self.lineEdit_start_money = QLineEdit(self)
        self.lineEdit_stop_money = QLineEdit(self)
        self.lineEdit_current_lottery_time = QLineEdit(self)
        self.lineEdit_current_lottery_money = QLineEdit(self)
        self.lineEdit_history_max_wrong_time = QLineEdit(self)
        self.lineEdit_history_max_lottery_money = QLineEdit(self)
        self.lineEdit_profit_money = QLineEdit(self)

        # 投注模式
        self.buttonGroup_buy_unit = QButtonGroup(self)
        self.radioButton_buy_yuan = QRadioButton(r'元', self)
        self.buttonGroup_buy_unit.addButton(self.radioButton_buy_yuan, 11)
        self.radioButton_buy_corner = QRadioButton(r'角', self)
        self.buttonGroup_buy_unit.addButton(self.radioButton_buy_corner, 12)
        self.radioButton_buy_cent = QRadioButton(r'分', self)
        self.buttonGroup_buy_unit.addButton(self.radioButton_buy_cent, 13)

        # 风险模式
        self.buttonGroup_risk = QButtonGroup(self)
        self.radioButton_low_risk = QRadioButton(r'低风险投资模式', self)
        self.buttonGroup_risk.addButton(self.radioButton_low_risk, 21)
        self.radioButton_medium_risk = QRadioButton(r'中风险投资模式', self)
        self.buttonGroup_risk.addButton(self.radioButton_medium_risk, 22)
        self.radioButton_high_risk = QRadioButton(r'高风险投资模式', self)
        self.buttonGroup_risk.addButton(self.radioButton_high_risk, 23)

        # 预测号码的个数
        self.buttonGroup_forecast_bit = QButtonGroup(self)
        self.radioButton_forecast_four_bit = QRadioButton(r'四码', self)
        self.buttonGroup_forecast_bit.addButton(
            self.radioButton_forecast_four_bit, 31)
        self.radioButton_forecast_five_bit = QRadioButton(r'五码', self)
        self.buttonGroup_forecast_bit.addButton(
            self.radioButton_forecast_five_bit, 32)
        self.radioButton_forecast_six_bit = QRadioButton(r'六码', self)
        self.buttonGroup_forecast_bit.addButton(
            self.radioButton_forecast_six_bit, 33)
        self.radioButton_forecast_seven_bit = QRadioButton(r'七码', self)
        self.buttonGroup_forecast_bit.addButton(
            self.radioButton_forecast_seven_bit, 34)
        # 追号期数
        self.buttonGroup_forecast_period = QButtonGroup(self)
        self.radioButton_forecast_one_period = QRadioButton(r'一期', self)
        self.buttonGroup_forecast_period.addButton(
            self.radioButton_forecast_one_period, 41)
        self.radioButton_forecast_two_period = QRadioButton(r'二期', self)
        self.buttonGroup_forecast_period.addButton(
            self.radioButton_forecast_two_period, 42)
        self.radioButton_forecast_three_period = QRadioButton(r'三期', self)
        self.buttonGroup_forecast_period.addButton(
            self.radioButton_forecast_three_period, 43)
        self.radioButton_forecast_four_period = QRadioButton(r'四期', self)
        self.buttonGroup_forecast_period.addButton(
            self.radioButton_forecast_four_period, 44)
        self.radioButton_forecast_five_period = QRadioButton(r'五期', self)
        self.buttonGroup_forecast_period.addButton(
            self.radioButton_forecast_five_period, 45)
        # 在线投注按钮
        self.pushButton_purchase_lottery = QPushButton(r'自动在线投注', self)

        # 初始化界面
        self.initialize()

    def initialize(self):
        # 开奖号码部分
        self.label_lottery_number.setFixedSize(60, 25)
        self.label_lottery_number.move(10, 5)
        self.label_lottery_wan.setFixedSize(50, 25)
        self.label_lottery_wan.move(80, 5)
        self.label_lottery_wan.setAlignment(Qt.AlignCenter)
        self.label_lottery_thousand.setFixedSize(50, 25)
        self.label_lottery_thousand.move(200, 5)
        self.label_lottery_thousand.setAlignment(Qt.AlignCenter)
        self.label_lottery_hundred.setFixedSize(50, 25)
        self.label_lottery_hundred.move(320, 5)
        self.label_lottery_hundred.setAlignment(Qt.AlignCenter)
        self.label_lottery_ten.setFixedSize(50, 25)
        self.label_lottery_ten.move(440, 5)
        self.label_lottery_ten.setAlignment(Qt.AlignCenter)
        self.label_lottery_unit.setFixedSize(50, 25)
        self.label_lottery_unit.move(560, 5)
        self.label_lottery_unit.setAlignment(Qt.AlignCenter)

        self.lineEdit_lottery_wan.setFixedSize(50, 25)
        self.lineEdit_lottery_wan.move(140, 5)
        self.lineEdit_lottery_thousand.setFixedSize(50, 25)
        self.lineEdit_lottery_thousand.move(260, 5)
        self.lineEdit_lottery_hundred.setFixedSize(50, 25)
        self.lineEdit_lottery_hundred.move(380, 5)
        self.lineEdit_lottery_ten.setFixedSize(50, 25)
        self.lineEdit_lottery_ten.move(500, 5)
        self.lineEdit_lottery_unit.setFixedSize(50, 25)
        self.lineEdit_lottery_unit.move(620, 5)

        # 获取开奖号码
        self.pushButton_get_lottery_number.setFixedSize(110, 25)
        self.pushButton_get_lottery_number.move(290, 35)
        # 预测号码部分

        # 万位部分
        self.label_forecast_wan.setFixedSize(60, 25)
        self.label_forecast_wan.move(10, 65)
        self.label_forecast_wan_single.setFixedSize(50, 25)
        self.label_forecast_wan_single.move(200, 65)
        self.label_forecast_wan_single.setAlignment(Qt.AlignCenter)
        self.lineEdit_forecast_wan_single_ratio.setFixedSize(50, 25)
        self.lineEdit_forecast_wan_single_ratio.move(260, 65)
        self.label_forecast_wan_double.setFixedSize(50, 25)
        self.label_forecast_wan_double.move(440, 65)
        self.label_forecast_wan_double.setAlignment(Qt.AlignCenter)
        self.lineEdit_forecast_wan_double_ratio.setFixedSize(50, 25)
        self.lineEdit_forecast_wan_double_ratio.move(500, 65)

        # 千位部分
        self.label_forecast_thousand.setFixedSize(60, 25)
        self.label_forecast_thousand.move(10, 95)
        self.label_forecast_thousand_single.setFixedSize(50, 25)
        self.label_forecast_thousand_single.move(200, 95)
        self.label_forecast_thousand_single.setAlignment(Qt.AlignCenter)
        self.lineEdit_forecast_thousand_single_ratio.setFixedSize(50, 25)
        self.lineEdit_forecast_thousand_single_ratio.move(260, 95)
        self.label_forecast_thousand_double.setFixedSize(50, 25)
        self.label_forecast_thousand_double.move(440, 95)
        self.label_forecast_thousand_double.setAlignment(Qt.AlignCenter)
        self.lineEdit_forecast_thousand_double_ratio.setFixedSize(50, 25)
        self.lineEdit_forecast_thousand_double_ratio.move(500, 95)

        # 百位部分
        self.label_forecast_hundred.setFixedSize(60, 25)
        self.label_forecast_hundred.move(10, 125)
        self.label_forecast_hundred_single.setFixedSize(50, 25)
        self.label_forecast_hundred_single.move(200, 125)
        self.label_forecast_hundred_single.setAlignment(Qt.AlignCenter)
        self.lineEdit_forecast_hundred_single_ratio.setFixedSize(50, 25)
        self.lineEdit_forecast_hundred_single_ratio.move(260, 125)
        self.label_forecast_hundred_double.setFixedSize(50, 25)
        self.label_forecast_hundred_double.move(440, 125)
        self.label_forecast_hundred_double.setAlignment(Qt.AlignCenter)
        self.lineEdit_forecast_hundred_double_ratio.setFixedSize(50, 25)
        self.lineEdit_forecast_hundred_double_ratio.move(500, 125)

        # 十位部分
        self.label_forecast_ten.setFixedSize(60, 25)
        self.label_forecast_ten.move(10, 155)
        self.label_forecast_ten_single.setFixedSize(50, 25)
        self.label_forecast_ten_single.move(200, 155)
        self.label_forecast_ten_single.setAlignment(Qt.AlignCenter)
        self.lineEdit_forecast_ten_single_ratio.setFixedSize(50, 25)
        self.lineEdit_forecast_ten_single_ratio.move(260, 155)
        self.label_forecast_ten_double.setFixedSize(50, 25)
        self.label_forecast_ten_double.move(440, 155)
        self.label_forecast_ten_double.setAlignment(Qt.AlignCenter)
        self.lineEdit_forecast_ten_double_ratio.setFixedSize(50, 25)
        self.lineEdit_forecast_ten_double_ratio.move(500, 155)

        # 个位部分
        self.label_forecast_unit.setFixedSize(60, 25)
        self.label_forecast_unit.move(10, 185)
        self.label_forecast_unit_single.setFixedSize(50, 25)
        self.label_forecast_unit_single.move(200, 185)
        self.label_forecast_unit_single.setAlignment(Qt.AlignCenter)
        self.lineEdit_forecast_unit_single_ratio.setFixedSize(50, 25)
        self.lineEdit_forecast_unit_single_ratio.move(260, 185)
        self.label_forecast_unit_double.setFixedSize(50, 25)
        self.label_forecast_unit_double.move(440, 185)
        self.label_forecast_unit_double.setAlignment(Qt.AlignCenter)
        self.lineEdit_forecast_unit_double_ratio.setFixedSize(50, 25)
        self.lineEdit_forecast_unit_double_ratio.move(500, 185)

        self.pushButton_forecast_single_double.setFixedSize(110, 25)
        self.pushButton_forecast_single_double.move(290, 215)

        # 在线投注部分
        # 设置用户信息与购买信息
        self.label_website.setFixedSize(60, 25)
        self.label_website.move(10, 245)
        self.lineEdit_website.setFixedSize(110, 25)
        self.lineEdit_website.move(80, 245)
        self.label_user_name.setFixedSize(50, 25)
        self.label_user_name.move(200, 245)
        self.label_user_name.setAlignment(Qt.AlignCenter)
        self.lineEdit_user_name.setFixedSize(50, 25)
        self.lineEdit_user_name.move(260, 245)
        self.label_user_password.setFixedSize(50, 25)
        self.label_user_password.move(320, 245)
        self.label_user_password.setAlignment(Qt.AlignCenter)
        self.lineEdit_user_password.setFixedSize(50, 25)
        self.lineEdit_user_password.move(380, 245)
        self.label_start_money.setFixedSize(50, 25)
        self.label_start_money.move(440, 245)
        self.label_start_money.setAlignment(Qt.AlignCenter)
        self.lineEdit_start_money.setFixedSize(50, 25)
        self.lineEdit_start_money.move(500, 245)
        self.label_stop_money.setFixedSize(50, 25)
        self.label_stop_money.move(560, 245)
        self.label_stop_money.setAlignment(Qt.AlignCenter)
        self.lineEdit_stop_money.setFixedSize(50, 25)
        self.lineEdit_stop_money.move(620, 245)

        # 显示投注信息
        self.label_current_lottery_time.setFixedSize(80, 25)
        self.label_current_lottery_time.move(10, 275)
        self.lineEdit_current_lottery_time.setFixedSize(40, 25)
        self.lineEdit_current_lottery_time.move(90, 275)
        self.label_current_lottery_money.setFixedSize(80, 25)
        self.label_current_lottery_money.move(140, 275)
        self.lineEdit_current_lottery_money.setFixedSize(40, 25)
        self.lineEdit_current_lottery_money.move(220, 275)
        self.label_history_max_wrong_time.setFixedSize(80, 25)
        self.label_history_max_wrong_time.move(270, 275)
        self.lineEdit_history_max_wrong_time.setFixedSize(40, 25)
        self.lineEdit_history_max_wrong_time.move(350, 275)
        self.label_history_max_lottery_money.setFixedSize(80, 25)
        self.label_history_max_lottery_money.move(400, 275)
        self.lineEdit_history_max_lottery_money.setFixedSize(40, 25)
        self.lineEdit_history_max_lottery_money.move(480, 275)
        self.label_profit_money.setFixedSize(80, 25)
        self.label_profit_money.move(530, 275)
        self.lineEdit_profit_money.setFixedSize(40, 25)
        self.lineEdit_profit_money.move(610, 275)

        # 设置用户购买方式
        self.label_lottery_bet_mode.setFixedSize(60, 25)
        self.label_lottery_bet_mode.move(10, 305)
        self.radioButton_buy_yuan.setFixedSize(50, 25)
        self.radioButton_buy_yuan.move(80, 305)
        self.radioButton_buy_corner.setFixedSize(50, 25)
        self.radioButton_buy_corner.move(140, 305)
        self.radioButton_buy_cent.setFixedSize(50, 25)
        self.radioButton_buy_cent.move(200, 305)
        self.label_lottery_risk_mode.setFixedSize(60, 25)
        self.label_lottery_risk_mode.move(260, 305)
        self.radioButton_low_risk.setFixedSize(110, 25)
        self.radioButton_low_risk.move(320, 305)
        self.radioButton_medium_risk.setFixedSize(110, 25)
        self.radioButton_medium_risk.move(440, 305)
        self.radioButton_high_risk.setFixedSize(110, 25)
        self.radioButton_high_risk.move(560, 305)

        self.label_lottery_buy_number_mode.setFixedSize(60, 25)
        self.label_lottery_buy_number_mode.move(10, 335)
        self.radioButton_forecast_four_bit.setFixedSize(50, 25)
        self.radioButton_forecast_four_bit.move(80, 335)
        self.radioButton_forecast_five_bit.setFixedSize(50, 25)
        self.radioButton_forecast_five_bit.move(140, 335)
        self.radioButton_forecast_six_bit.setFixedSize(50, 25)
        self.radioButton_forecast_six_bit.move(200, 335)
        self.radioButton_forecast_seven_bit.setFixedSize(50, 25)
        self.radioButton_forecast_seven_bit.move(260, 335)
        self.label_lottery_follow_mode.setFixedSize(50, 25)
        self.label_lottery_follow_mode.move(320, 335)
        self.radioButton_forecast_one_period.setFixedSize(50, 25)
        self.radioButton_forecast_one_period.move(380, 335)
        self.radioButton_forecast_two_period.setFixedSize(50, 25)
        self.radioButton_forecast_two_period.move(440, 335)
        self.radioButton_forecast_three_period.setFixedSize(50, 25)
        self.radioButton_forecast_three_period.move(500, 335)
        self.radioButton_forecast_four_period.setFixedSize(50, 25)
        self.radioButton_forecast_four_period.move(560, 335)
        self.radioButton_forecast_five_period.setFixedSize(50, 25)
        self.radioButton_forecast_five_period.move(620, 335)

        # 在线购买彩票
        self.pushButton_purchase_lottery.setFixedSize(110, 25)
        self.pushButton_purchase_lottery.move(290, 365)
        # 界面全局设置
        self.setGeometry(500, 300, 680, 400)
        self.setWindowTitle(r'重庆时时彩预测单双软件')
Example #2
0
    def __init__(self, parent, name=None):
        super().__init__()
        self.parent = parent
        self.name = name

        self.cron_job = None

        self.layout = QHBoxLayout()

        self.setMovable(True)
        self.is_running = False
        self.is_enabled_checkbox = QCheckBox(self.name)

        self.num_tanks = 30
        self.num_quantity = ["1", "2", "3", "4"]
        self.program_settings = {
            "Program_name": self.name,
            "Enabled": self.is_enabled_checkbox.isChecked(),
            "Type": "Feeding and washing",
            "Day": None,
            "Time": None,
            "Tanks": [None] * self.num_tanks
        }
        program_default = copy(self.program_settings)

        # Layout left
        self.left_layout = QVBoxLayout()
        self.left_layout.setAlignment(Qt.AlignTop)

        self.button_startstop = QPushButton("Run", self)
        self.button_startstop.setFixedSize(QtCore.QSize(100, 35))
        self.button_startstop.setCheckable(True)
        self.button_startstop.clicked.connect(lambda: self.start_program())
        self.button_reset = QPushButton("Reset", self)
        self.button_reset.setFixedSize(QtCore.QSize(100, 35))
        self.button_reset.clicked.connect(lambda: self.reset(program_default))
        self.button_reset.clicked.connect(lambda: self.repaint())
        self.button_duplicate = QPushButton("Duplicate", self)
        self.button_duplicate.setFixedSize(QtCore.QSize(100, 35))
        self.button_duplicate.clicked.connect(lambda: self.duplicate())
        self.button_delete = QPushButton("Delete", self)
        self.button_delete.setFixedSize(QtCore.QSize(100, 35))
        self.button_delete.clicked.connect(lambda: self.delete_tab())

        self.first_button_row_layout = QHBoxLayout()
        self.first_button_row_layout.setAlignment(Qt.AlignLeft)
        self.first_button_row_layout.addWidget(self.button_startstop)
        self.first_button_row_layout.addWidget(self.button_reset)

        self.second_button_row_layout = QHBoxLayout()
        self.second_button_row_layout.setAlignment(Qt.AlignLeft)
        self.second_button_row_layout.addWidget(self.button_duplicate)
        self.second_button_row_layout.addWidget(self.button_delete)

        self.left_layout.addLayout(self.first_button_row_layout)
        self.left_layout.addLayout(self.second_button_row_layout)

        # Create a button group for feed & washing
        self.bgroup1_1 = QButtonGroup(self)
        # self.bgroup1_1.setExclusive(False)
        self.button_feeding = QRadioButton("Feeding and washing", self)
        self.button_feeding.setCheckable(True)
        self.button_feeding.setChecked(True)
        self.button_washing = QRadioButton("Only washing", self)
        # self.button_washing.setEnabled(False)
        self.button_washing.setCheckable(True)

        self.bgroup1_1.addButton(self.button_feeding, 1)
        self.bgroup1_1.addButton(self.button_washing, 2)
        self.bgroup1_1.buttonClicked.connect(
            lambda: self.record_log("Type", self.bgroup1_1))

        # Create a group box for feeding & washing
        gpbox1_1 = QGroupBox("Program Type")
        grid = QVBoxLayout()
        grid.addWidget(self.button_feeding)
        grid.addWidget(self.button_washing)
        grid.setAlignment(Qt.AlignLeft)
        gpbox1_1.setLayout(grid)
        self.left_layout.addWidget(gpbox1_1)

        # Create a button group for day of week
        self.button_dow = [
            'Monday',
            'Tuesday',
            'Wednesday',
            'Thursday',
            'Friday',
            'Saturday',
            'Sunday',
            'Everyday',
        ]
        self.bgroup1_2 = QButtonGroup(self)
        self.bgroup1_2.setExclusive(False)
        for id, name in enumerate(self.button_dow):
            button = QCheckBox(name, self)
            button.stateChanged.connect(lambda: self.update_active_days())
            if name == 'Everyday':
                button.clicked.connect(lambda: self.check_everyday())
            self.bgroup1_2.addButton(button, id)

        # adds each button to the layout
        gpbox1_2 = QGroupBox("Select day of week")
        gpbox1_2.setAlignment(Qt.AlignLeft)
        grid = QGridLayout()
        grid.setSpacing(5)
        for i, button in enumerate(self.bgroup1_2.buttons()):
            grid.addWidget(button, i % 4, i // 4)
        gpbox1_2.setLayout(grid)
        self.left_layout.addWidget(gpbox1_2)

        # Add time pulldown
        gpbox1_2_1 = QGroupBox("Select time")
        self.pd_time = QComboBox(self)
        for h in range(24):
            for m in range(2):
                self.pd_time.addItem(
                    f'{h // 12 * 12 + h % 12} : {m * 30 :02d} {"AM" if h < 12 else "PM"}'
                )
        self.pd_time.currentIndexChanged.connect(lambda: self.update_time())
        self.update_time()
        gpbox1_2_1_layout = QVBoxLayout()
        gpbox1_2_1_layout.addWidget(self.pd_time)
        gpbox1_2_1.setLayout(gpbox1_2_1_layout)
        self.left_layout.addWidget(gpbox1_2_1)

        # Group box right
        # Box for food quantity =================================================
        gpbox2 = QGroupBox("Food Quantity")
        gpbox2.setStyleSheet('QGroupBox:title {'
                             'subcontrol-origin: margin;'
                             'subcontrol-position: top center;'
                             'padding-left: 10px;'
                             'padding-right: 10px; }')
        gpbox2_layout = QVBoxLayout()
        gpbox2.setLayout(gpbox2_layout)

        gpbox2_1 = QGroupBox()
        grid = QGridLayout()
        grid.setSpacing(15)
        scroll = QScrollArea()
        scroll.setWidget(gpbox2_1)
        # scroll.setFixedWidth(470)
        scroll.setWidgetResizable(True)

        self.bgroup2_1 = QButtonGroup(self)  # buttn gp of tank selecetion
        self.bgroup2_1.setExclusive(False)
        self.bgroup2_2 = [
        ]  # QButtonGroup(self)  # buttn gp of food amount selecetion

        # Select/Unselect all tanks
        self.select_unselect_all_checkbox = QCheckBox(f'All Tanks', self)
        self.select_unselect_all_checkbox.toggled.connect(
            self.select_unselect_all_tanks)
        self.select_unselect_all_checkbox.setChecked(True)
        self.bgroup2_1.addButton(self.select_unselect_all_checkbox, 1)
        grid.addWidget(self.select_unselect_all_checkbox, 0, 0)
        bg = QButtonGroup(self)
        for j, name in enumerate(self.num_quantity):
            b = QRadioButton(name, self)
            b.setFixedSize(QtCore.QSize(40, 20))
            b.setCheckable(True)
            bg.addButton(b, j + 1)
            grid.addWidget(b, 0, j + 1)
        bg.buttonClicked.connect(lambda: self.select_unselect_food_amount())
        self.bgroup2_2.append(bg)

        # Populate tank rows
        for i in range(1, self.num_tanks + 1):
            cb = QCheckBox(f'Tank {i}', self)
            cb.setChecked(True)
            self.bgroup2_1.addButton(cb, i + 1)
            grid.addWidget(cb, i, 0)
            bg = QButtonGroup(self)
            for j, name in enumerate(self.num_quantity):
                b = QRadioButton(name, self)
                b.setFixedSize(QtCore.QSize(40, 20))
                b.setCheckable(True)
                bg.addButton(b, j + 1)
                grid.addWidget(b, i, j + 1)
            bg.buttonClicked.connect(lambda: self.record_log())
            self.bgroup2_2.append(bg)
        self.bgroup2_1.buttonClicked.connect(lambda: self.record_log())
        grid.setAlignment(Qt.AlignCenter)
        gpbox2_1.setLayout(grid)
        gpbox2_layout.addWidget(scroll)

        # Add to layout
        self.layout.addLayout(self.left_layout)
        self.layout.addWidget(gpbox2)
        self.setLayout(self.layout)

        self.update_json()