首页 > 解决方案 > 打开文件对话框重复运行两次

问题描述

我尝试QFileDialog在 PyQt5 中为 pandas 数据框打开两种不同类型的文件,但在执行之前它会为每个文件重复打开两次。但是,当我仅使用特定文件“文件名”时,它将直接执行一次。

它使用以下代码打开了两次:

class dataframe(QWidget):
    def __init__(self, parent=None):
        super(dataframe, self).__init__(parent)

        layout = QVBoxLayout(self)
        canvas = mycanvas(self)
        layout.addWidget(canvas)

        self.btn3 = QPushButton("Plot")
        self.btn3.clicked.connect(canvas.PlotChart)
        layout.addWidget(self.btn3)


    def input(self):
        lasdata = QFileDialog.getOpenFileName(self, 'Open LAS', r'data/', "LAS files (*.las)")[0]
        textdata = QFileDialog.getOpenFileName(self, 'Open Text', r'data/', "Text files (*.txt)")[0]

        l = lasio.read(f"{lasdata}")
        data = l.df()
        data = data.replace('-999.00000', np.nan)
        data.index.names = ['DEPT']
        w = l.well.WELL.value
        data['WELL'] = w


        text = pd.read_csv(f"{textdata}", sep='\t')
        text_unit = text['RU'].unique()

        data_w = pd.DataFrame()
        for i in range(len(text_unit)):
            top = text.iloc[i]['D']
            if i < len(text_unit) - 1:
                bottom = text.iloc[i + 1]['D']
            else:
                bottom = int(round(data.tail(1).index.item()))
            data_int = data.iloc[top:bottom, :]
            data_int['INT'] = text.iloc[i]['RU']
            data_w = data_w.append(data_int)
        data = data_w

        return w, data


    def det(self, gr):
        w, data = dataframe.input(self)

        GR = data.iloc[:, gr]

        conditions = [
            (GR <= 60),
            (GR >= 60)]
        lit = ['A', 'B']
        data['L'] = np.select(conditions, lit, default='Undefined')
        return data


    def calculation(self):
        w, data = dataframe.input(self)
        data = dataframe.det(self, 1)

        data_well = pd.DataFrame()
        data_int = pd.DataFrame()
        F_w = pd.DataFrame()
        Fa = pd.DataFrame()
        text_unit = data['INT'].unique()

        for i in range(len(text_unit)):
            data_int = data.where(data['INT'] == text_unit[i]).dropna()
            F_percent = data_int['L'].value_counts(normalize=True) * 100
            F_percent = F_percent.sort_index()
            F_percent['INT'] = text_unit[i]
            F_percent = pd.DataFrame(F_percent).transpose()
            F_w = F_w.append(F_percent)
        F_w['W'] = w
        Fa = Fa.append(F_w)
        F_w = pd.DataFrame()

        Fa = Fa.reset_index()
        Fa = Fa.fillna(0)

        return Fa


class mycanvas(FigureCanvas):
    def __init__(self, parent=None, dpi=120):
        self.fig = plt.Figure(dpi=dpi)
        FigureCanvas.__init__(self, self.fig)

    def PlotChart(self):
        outputs = dataframe.calculation(self)  # .where(Fa['W']==well)
        int = outputs['INT'].unique()

        self.axes = self.fig.add_subplot(111)
        self.axes.set_title("AA")
        outputs.plot.barh(x='INT', stacked=True, ax=self.axes)
        self.axes.set_yticks(range(len('INT')), 'INT')
        self.draw()


if __name__ == '__main__':
    app = QApplication(sys.argv)
    window = dataframe()
    window.show()
    sys.exit(app.exec_())

但是,它使用以下代码直接执行一次:

        def Input(self):
                lasdata = 'data/AA.las'
                textdata = 'data/AATEXT.txt'
            
                l = lasio.read(lasdata)
                data = l.df()
            
                text = pd.read_csv(textdata, sep='\t')

文件对话框代码是否有问题,就像它成功执行一次的较低代码(直接名称)一样,但是在读取下一个代码之前它打开了两次文件对话框。我需要制作 GUI 应用程序,所以我需要使用文件对话框。

这是带有两个按钮的代码的一部分:

    self.btn1 = QPushButton("LAS File")
    self.btn1.clicked.connect(self.las)
    self.btn2 = QPushButton("Text File")
    self.btn2.clicked.connect(self.text)
    self.btn3 = QPushButton("Plot")
    self.btn3.clicked.connect(canvas.PlotChart)
    layout.addWidget(self.btn1)
    layout.addWidget(self.btn2)
    layout.addWidget(self.btn3)


def las(self):
    self.lasfile = QFileDialog.getOpenFileName(self, 'Open LAS', r'data/', "LAS files (*.las)")[0]

def text(self):
    self.textfile = QFileDialog.getOpenFileName(self, 'Open Text', r'data/', "Text files (*.txt)")[0]

def input(self):
    lasdata = self.lasfile
    textdata = self.textfile

    l = lasio.read(f"{lasdata}")
    data = l.df()
    data = data.replace('-999.00000', np.nan)
    data.index.names = ['DEPT']
    w = l.well.WELL.value
    data['WELL'] = w


    text = pd.read_csv(f"{textdata}", sep='\t')
    text_unit = text['RU'].unique()

我试着把它做成两个按钮,但无法打开或退出无法执行。

below is one of the text format 
WN  RU  D
AA  SR  19
AA  TF  50
AA  PSU 1700

标签: pythonpandaspyqt5openfiledialog

解决方案


推荐阅读