如何检查单选按钮是否已从其他类中检查?

2024-09-30 03:22:44 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在PyQt5中制作一个GUI,其中有多个选项卡。在其中一个选项卡中,用户选择一个单选按钮,其中包含要输入的数据类型

此信息更改了其他选项卡中可用的按钮,我在从原始选项卡类传递此信息时遇到问题。我想看看是否从另一个选项卡选中了单选按钮,如果是,启用一个按钮

我有一个函数根据所选的单选按钮返回字符串,但是当我从另一个选项卡调用getDataType()函数时,会出现错误“AttributeError:module'DataTab'没有属性'getDataType'。”

我尝试将getDataType()函数移到DataTab类之外,但由于单选按钮使用“self”,因此无法访问它们

我也尝试过创建一个新类,并从函数中调用这个新类,但后来我就陷入了如何将信息传递到另一个选项卡的困境

所以在这个例子中,一旦用户选择了数据选项卡中的单选按钮,我希望启用分析选项卡上相应的按钮

当我取消对getDataType()的调用的注释时,我得到以下错误:“AttributeError:模块'DataTab'没有属性'getDataType'”

from PyQt5.QtWidgets import (QWidget, QVBoxLayout, QLabel, QTableWidget, QTableWidgetItem,
                             QLineEdit, QFileDialog, QRadioButton, QGroupBox, QPushButton,
                             QGridLayout, QButtonGroup, QApplication, QAbstractItemView,
                             QTabWidget)
from PyQt5.QtGui import QIcon
import sys, os


class TabPage(QTabWidget):
    def __init__(self):
        super().__init__()
        self.setStyleSheet('font: 15pt Tw Cen MT')
        self.show()
        # Creating the tabs here to have a reference
        self.tabWidget = QTabWidget()
        self.tabWidget.addTab(DataTab(), "Data Input")
        self.tabWidget.addTab(AnalysisTab(), "Analysis")

        self.layout = QVBoxLayout()
        self.layout.addWidget(self.tabWidget)
        self.setLayout(self.layout)

# The DataTab class holds all the GUI for the DataTab
class DataTab(QWidget):
    def __init__(self):
        super().__init__()
        self.app = QApplication(sys.argv)

        self.layout = QGridLayout()

        self.intervalRadioButton = QRadioButton("Interval")
        self.ordinalRadioButton = QRadioButton("Ordinal")
        self.frequencyRadioButton = QRadioButton("Frequency")

        self.submitButton = QPushButton("Submit Data")

        self.layout.addWidget(self.intervalRadioButton, 7, 0, 1, 3)
        self.layout.addWidget(self.ordinalRadioButton, 8, 0, 1, 3)
        self.layout.addWidget(self.frequencyRadioButton, 9, 0, 1, 3)
        self.setLayout(self.layout)
        self.show()


    def getDataType(self):
        if self.intervalRadioButton.isChecked():
            return "interval"
        elif self.ordinalRadioButton.isChecked():
            return "ordinal"
        elif self.frequencyRadioButton.isChecked():
            return "frequency"


class AnalysisTab(QWidget):
    def __init__(self):
        super().__init__()

        self.app = QApplication(sys.argv)

        self.createChooseIntervalGroup()
        self.createChooseOrdinalGroup()
        self.createChooseFrequencyGroup()

        self.layout = QGridLayout()
        self.layout.addWidget(self.ChooseIntervalGroup, 0, 1)
        self.layout.addWidget(self.ChooseOrdinalGroup, 1, 1)
        self.layout.addWidget(self.ChooseFrequencyGroup, 2, 1)
        self.setLayout(self.layout)
        self.show()

    # The right side of AnalysisTab containing the buttons for
    # analysis
    def createChooseIntervalGroup(self):
        self.ChooseIntervalGroup = QGroupBox("Tests for Interval Data")

        self.analyzeIntervalButton = QPushButton("Analyze")
        self.analyzeIntervalButton.setEnabled(False)

        # if DataTab.getDataType() != "interval":
        #     self.analyzeIntervalButton.setEnabled(True)

        self.layout = QGridLayout()
        self.layout.addWidget(self.analyzeIntervalButton, 1, 1)
        self.ChooseIntervalGroup.setLayout(self.layout)

    # The right side of AnalysisTab containing the buttons for
    # analysis
    def createChooseOrdinalGroup(self):
        self.ChooseOrdinalGroup = QGroupBox("Tests for Ordinal Data")

        self.analyzeOrdinalButton = QPushButton("Analyze")
        self.analyzeOrdinalButton.setEnabled(False)

        # if DataTab.getDataType() != "ordinal":
        #     self.analyzeIntervalButton.setEnabled(True)

        self.layout = QGridLayout()
        self.layout.addWidget(self.analyzeOrdinalButton, 1, 1)
        self.ChooseOrdinalGroup.setLayout(self.layout)

    # The right side of AnalysisTab containing the buttons for
    # analysis
    def createChooseFrequencyGroup(self):
        self.ChooseFrequencyGroup = QGroupBox("Tests for Frequency Data")

        self.analyzeFrequencyButton = QPushButton("Analyze")
        self.analyzeFrequencyButton.setEnabled(False)

        # if DataTab.getDataType() != "frequency":
        #     self.analyzeIntervalButton.setEnabled(True)

        self.layout = QGridLayout()
        self.layout.addWidget(self.analyzeFrequencyButton, 1, 1)
        self.ChooseFrequencyGroup.setLayout(self.layout)

def run():
    app = QApplication(sys.argv)
    tabPage = TabPage()
    tabPage.show()
    app.exec_()

run()

Tags: theselfforinitdef按钮选项卡layout
1条回答
网友
1楼 · 发布于 2024-09-30 03:22:44

对于这种情况,一种可能的解决方案是使用这些信号来通知QRadioButton状态的变化,以启用或禁用该按钮

import sys

from PyQt5.QtGui import QIcon
from PyQt5.QtWidgets import (
    QWidget,
    QVBoxLayout,
    QRadioButton,
    QGroupBox,
    QPushButton,
    QGridLayout,
    QButtonGroup,
    QApplication,
    QTabWidget,
)


class Widget(QWidget):
    def __init__(self, parent=None):
        super().__init__(parent)
        self.setStyleSheet("font: 15pt Tw Cen MT")

        self.data_tab = DataTab()
        self.analysis_tab = AnalysisTab()

        self.tabWidget = QTabWidget()
        self.tabWidget.addTab(self.data_tab, "Data Input")
        self.tabWidget.addTab(self.analysis_tab, "Analysis")

        layout = QVBoxLayout(self)
        layout.addWidget(self.tabWidget)

        self.data_tab.intervalRadioButton.toggled.connect(
            self.analysis_tab.analyzeIntervalButton.setEnabled
        )
        self.data_tab.ordinalRadioButton.toggled.connect(
            self.analysis_tab.analyzeOrdinalButton.setEnabled
        )
        self.data_tab.frequencyRadioButton.toggled.connect(
            self.analysis_tab.analyzeFrequencyButton.setEnabled
        )


class DataTab(QWidget):
    def __init__(self, parent=None):
        super().__init__(parent)
        layout = QGridLayout(self)
        self.intervalRadioButton = QRadioButton("Interval")
        self.ordinalRadioButton = QRadioButton("Ordinal")
        self.frequencyRadioButton = QRadioButton("Frequency")
        self.submitButton = QPushButton("Submit Data")
        layout.addWidget(self.intervalRadioButton, 7, 0, 1, 3)
        layout.addWidget(self.ordinalRadioButton, 8, 0, 1, 3)
        layout.addWidget(self.frequencyRadioButton, 9, 0, 1, 3)


class AnalysisTab(QWidget):
    def __init__(self, parent=None):
        super().__init__(parent)
        self.createChooseIntervalGroup()
        self.createChooseOrdinalGroup()
        self.createChooseFrequencyGroup()

        layout = QGridLayout(self)
        layout.addWidget(self.ChooseIntervalGroup, 0, 1)
        layout.addWidget(self.ChooseOrdinalGroup, 1, 1)
        layout.addWidget(self.ChooseFrequencyGroup, 2, 1)

    def createChooseIntervalGroup(self):
        self.ChooseIntervalGroup = QGroupBox("Tests for Interval Data")
        self.analyzeIntervalButton = QPushButton("Analyze")
        self.analyzeIntervalButton.setEnabled(False)
        layout = QGridLayout(self.ChooseIntervalGroup)
        layout.addWidget(self.analyzeIntervalButton, 1, 1)

    def createChooseOrdinalGroup(self):
        self.ChooseOrdinalGroup = QGroupBox("Tests for Ordinal Data")
        self.analyzeOrdinalButton = QPushButton("Analyze")
        self.analyzeOrdinalButton.setEnabled(False)
        layout = QGridLayout(self.ChooseOrdinalGroup)
        layout.addWidget(self.analyzeOrdinalButton, 1, 1)

    def createChooseFrequencyGroup(self):
        self.ChooseFrequencyGroup = QGroupBox("Tests for Frequency Data")
        self.analyzeFrequencyButton = QPushButton("Analyze")
        self.analyzeFrequencyButton.setEnabled(False)
        layout = QGridLayout(self.ChooseFrequencyGroup)
        layout.addWidget(self.analyzeFrequencyButton, 1, 1)


def run():
    app = QApplication(sys.argv)
    tabPage = Widget()
    tabPage.show()
    app.exec_()


run()

相关问题 更多 >

    热门问题