RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 1268638
Accepted
bluesky
bluesky
Asked:2022-04-11 08:04:47 +0000 UTC2022-04-11 08:04:47 +0000 UTC 2022-04-11 08:04:47 +0000 UTC

如何组合两个 PyQt5 代码

  • 772

开始学习PyQt。看了很多关于PyQt和OOP的教程。对于简单的情况,逻辑或多或少是清楚的。但是当涉及到从更简单的元素构建更复杂的代码时,代码在OOP中的结构并不完全清楚。

目标是构建一个窗口,上面有两个Layout(左和右)。窗口的左半部分应显示一个表格,其中包含从 csv 文件加载的数据。在窗口的右半部分,有一个根据这些表格数据构建的图表。

有两个工人代码分别执行这些任务中的每一个。

告诉我如何将两个代码合二为一,或者至少应该是什么代码结构。

代码открытия/записи csv-файла:

import sys
import os
import csv
from PyQt5.QtWidgets import QTableWidget, QApplication, QMainWindow, QTableWidgetItem, QFileDialog
from PyQt5.QtWidgets import qApp, QAction

class MyTable(QTableWidget):
    def __init__(self, r, c):
        super().__init__(r, c)
        self.check_change = True
        self.init_ui()

    def init_ui(self):
        self.cellChanged.connect(self.c_current)
        self.show()

    def c_current(self):
        if self.check_change:
            row = self.currentRow()
            col = self.currentColumn()
            value = self.item(row, col)
            value = value.text()
            print("The current cell is ", row, ", ", col)
            print("In this cell we have: ", value)

    def open_sheet(self):
        self.check_change = False
        path = QFileDialog.getOpenFileName(self, 'Open CSV', os.getenv('HOME'), 'CSV(*.csv)')
        if path[0] != '':
            with open(path[0]) as csv_file:
                self.setRowCount(0)
                self.setColumnCount(2)
                my_file = csv.reader(csv_file, dialect='excel')
                for row_data in my_file:
                    row = self.rowCount()
                    self.insertRow(row)
                    if len(row_data) > 2:
                        self.setColumnCount(len(row_data))
                    for column, stuff in enumerate(row_data):
                        item = QTableWidgetItem(stuff)
                        self.setItem(row, column, item)
        self.check_change = True

    def save_sheet(self):
        path = QFileDialog.getSaveFileName(self, 'Save CSV', os.getenv('HOME'), 'CSV(*.csv)')
        if path[0] != '':
            with open(path[0], 'w', newline='') as csv_file:
                writer = csv.writer(csv_file, dialect='excel')
                for row in range(self.rowCount()):
                    row_data = []
                    for column in range(self.columnCount()):
                        item = self.item(row, column)
                        if item is not None:
                            row_data.append(item.text())
                        else:
                            row_data.append('')
                    writer.writerow(row_data)

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

        self.form_widget = MyTable(10, 2)
        self.setCentralWidget(self.form_widget)
        col_headers = ['x', 'y']
        self.form_widget.setHorizontalHeaderLabels(col_headers)

        # Set up menu
        bar = self.menuBar()
        file = bar.addMenu('Файл')

        save_action = QAction('&Сохранить', self)
        save_action.setShortcut('Ctrl+S')
        open_action = QAction('&Открыть', self)
        quit_action = QAction('&Выйти', self)

        file.addAction(save_action)
        file.addAction(open_action)
        file.addAction(quit_action)

        quit_action.triggered.connect(self.quit_app)
        save_action.triggered.connect(self.form_widget.save_sheet)
        open_action.triggered.connect(self.form_widget.open_sheet)
        self.setGeometry(700, 300, 300, 500)
        self.show()

    def quit_app(self):
        qApp.quit()

app = QApplication(sys.argv)
sheet = Sheet()
sys.exit(app.exec_())

代码для вывода графика Matplotlib:

import sys
from PyQt5.QtWidgets import QApplication, QMainWindow, QMenu, QVBoxLayout, QSizePolicy, QMessageBox, QWidget, QPushButton
from PyQt5.QtGui import QIcon
from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvas
from matplotlib.figure import Figure
import matplotlib.pyplot as plt

class App(QMainWindow):

    def __init__(self):
        super().__init__()
        self.left = 600
        self.top = 300
        self.title = 'График'
        self.width = 640
        self.height = 400
        self.initUI()

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

        m = PlotCanvas(self, width=5, height=4)
        m.move(0,0)

        button = QPushButton('Кнопка', self)
        button.setToolTip('Подсказка')
        button.move(500,0)
        button.resize(100,20)

        self.show()

class PlotCanvas(FigureCanvas):

    def __init__(self, parent=None, width=5, height=4, dpi=100):
        fig = Figure(figsize=(width, height), dpi=dpi)
        FigureCanvas.__init__(self, fig)
        self.setParent(parent)

        FigureCanvas.setSizePolicy(self,
                QSizePolicy.Expanding,
                QSizePolicy.Expanding)
        FigureCanvas.updateGeometry(self)
        self.plot()

    def plot(self):
        x = [0,1,2,3,4,5,6,7,8,9,10]
        y = [0,1,2,3,4,5,6,7,8,9,10]
        ax = self.figure.add_subplot(111)
        ax.plot(x, y, 'r-')
        ax.set_title('График')
        self.draw()

if __name__ == '__main__':
    app = QApplication(sys.argv)
    ex = App()
    sys.exit(app.exec_())
python
  • 1 1 个回答
  • 10 Views

1 个回答

  • Voted
  1. Best Answer
    S. Nick
    2022-04-11T16:45:34Z2022-04-11T16:45:34Z

    试试这样:

    主文件

    import sys
    import os
    import csv
    from PyQt5.QtWidgets import QTableWidget, QApplication, \
        QMainWindow, QTableWidgetItem, QFileDialog, \
        QWidget, QGridLayout, QPushButton
    from PyQt5.QtWidgets import qApp, QAction
    from PyQt5.QtCore import Qt
    
    from q1268638_2 import PlotCanvas                                    # +++
    
    
    class MyTable(QTableWidget):
        def __init__(self, r, c):
            super().__init__(r, c)
            self.check_change = True
            self.init_ui()
    
        def init_ui(self):
            self.cellChanged.connect(self.c_current)
    #        self.show()
    
        def c_current(self):
            if self.check_change:
                row = self.currentRow()
                col = self.currentColumn()
                value = self.item(row, col)
                value = value.text()
                print("The current cell is ", row, ", ", col)
                print("In this cell we have: ", value)
    
        def open_sheet(self):
            self.check_change = False
            path = QFileDialog.getOpenFileName(self, 'Open CSV', os.getenv('HOME'), 'CSV(*.csv)')
            if path[0] != '':
                with open(path[0]) as csv_file:
                    self.setRowCount(0)
                    self.setColumnCount(2)
                    my_file = csv.reader(csv_file, dialect='excel')
                    for row_data in my_file:
                        row = self.rowCount()
                        self.insertRow(row)
                        if len(row_data) > 2:
                            self.setColumnCount(len(row_data))
                        for column, stuff in enumerate(row_data):
                            item = QTableWidgetItem(stuff)
                            self.setItem(row, column, item)
            self.check_change = True
    
        def save_sheet(self):
            path = QFileDialog.getSaveFileName(self, 'Save CSV', os.getenv('HOME'), 'CSV(*.csv)')
            if path[0] != '':
                with open(path[0], 'w', newline='') as csv_file:
                    writer = csv.writer(csv_file, dialect='excel')
                    for row in range(self.rowCount()):
                        row_data = []
                        for column in range(self.columnCount()):
                            item = self.item(row, column)
                            if item is not None:
                                row_data.append(item.text())
                            else:
                                row_data.append('')
                        writer.writerow(row_data)
    
    
    class Sheet(QMainWindow):
        def __init__(self):
            super().__init__()
            
            cent_widget = QWidget()                                             # +++
            self.setCentralWidget(cent_widget)                                  # +++
    
            self.form_widget = MyTable(10, 2)
    #        self.setCentralWidget(self.form_widget)
            col_headers = ['x', 'y']
            self.form_widget.setHorizontalHeaderLabels(col_headers)
    
            # Set up menu
            bar = self.menuBar()
            file = bar.addMenu('Файл')
    
            save_action = QAction('&Сохранить', self)
            save_action.setShortcut('Ctrl+S')
            open_action = QAction('&Открыть', self)
            quit_action = QAction('&Выйти', self)
    
            file.addAction(save_action)
            file.addAction(open_action)
            file.addAction(quit_action)
    
            quit_action.triggered.connect(self.quit_app)
            save_action.triggered.connect(self.form_widget.save_sheet)
            open_action.triggered.connect(self.form_widget.open_sheet)
    #        self.setGeometry(700, 300, 300, 500)
    #        self.show()
    
    # +++ vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
            self.plotCanvas = PlotCanvas(self, width=5, height=4)
            
            button = QPushButton('Кнопка')
            button.setToolTip('Подсказка')
            button.clicked.connect(self.onClicked)
    
            layout = QGridLayout(cent_widget)
            layout.addWidget(self.form_widget, 0, 0) 
            layout.addWidget(self.plotCanvas, 0, 1)
            layout.addWidget(button, 1, 0, 1, 2)
            
        def onClicked(self):
            columns = self.form_widget.columnCount()
            rows = self.form_widget.rowCount()
            x, y = [], []
            for col in range(2):             # columns
               for row in range(rows): 
                   item = self.form_widget.item(row, col)
                   if col == 0:
                       x.append(int(item.text()) if item else 0 )
                   elif col == 1:
                       y.append(int(item.text()) if item else 0 )
            #print(x, y)
            
            self.plotCanvas.plot(x, y)
    # +++ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    
        def quit_app(self):
            qApp.quit()
    
    
    if __name__ == "__main__":
        app = QApplication(sys.argv)
        sheet = Sheet()
        sheet.show()
        sys.exit(app.exec_())
    

    q1268638_2.py

    import sys
    from PyQt5.QtWidgets import QApplication, QMainWindow, QMenu, QVBoxLayout, QSizePolicy, QMessageBox, QWidget, QPushButton
    from PyQt5.QtGui import QIcon
    from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvas
    from matplotlib.figure import Figure
    import matplotlib.pyplot as plt
    
    class App(QMainWindow):
    
        def __init__(self):
            super().__init__()
            self.left = 600
            self.top = 300
            self.title = 'График'
            self.width = 640
            self.height = 400
            self.initUI()
    
        def initUI(self):
            self.setWindowTitle(self.title)
            self.setGeometry(self.left, self.top, self.width, self.height)
    
            m = PlotCanvas(self, width=5, height=4)
            m.move(0,0)
    
            button = QPushButton('Кнопка', self)
            button.setToolTip('Подсказка')
            button.move(500,0)
            button.resize(100,20)
    
            self.show()
    
    class PlotCanvas(FigureCanvas):
    
        def __init__(self, parent=None, width=5, height=4, dpi=100):
            fig = Figure(figsize=(width, height), dpi=dpi)
            FigureCanvas.__init__(self, fig)
            self.setParent(parent)
    
            FigureCanvas.setSizePolicy(self,
                    QSizePolicy.Expanding,
                    QSizePolicy.Expanding)
            FigureCanvas.updateGeometry(self)
            
            x = [0,1,2,3,4,5,6,7,8,9,10]                          # +
            y = [0,1,2,7,4,5,6,7,3,9,10]                          # +
            self.plot(x, y)                                       # + (x, y)
    
        def plot(self, x, y):                                     # + (x, y)
    #        x = [0,1,2,3,4,5,6,7,8,9,10]
    #        y = [0,1,2,7,4,5,6,7,3,9,10]
            ax = self.figure.add_subplot(111)
            ax.clear()                                            # +
            ax.plot(x, y, 'r-')
            ax.set_title('График')
            self.draw()
    
    if __name__ == '__main__':
        app = QApplication(sys.argv)
        ex = App()
        sys.exit(app.exec_())
    

    在此处输入图像描述

    • 3

相关问题

  • 是否可以以某种方式自定义 QTabWidget?

  • telebot.anihelper.ApiException 错误

  • Python。检查一个数字是否是 3 的幂。输出 无

  • 解析多个响应

  • 交换两个数组的元素,以便它们的新内容也反转

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    表格填充不起作用

    • 2 个回答
  • Marko Smith

    提示 50/50,有两个,其中一个是正确的

    • 1 个回答
  • Marko Smith

    在 PyQt5 中停止进程

    • 1 个回答
  • Marko Smith

    我的脚本不工作

    • 1 个回答
  • Marko Smith

    在文本文件中写入和读取列表

    • 2 个回答
  • Marko Smith

    如何像屏幕截图中那样并排排列这些块?

    • 1 个回答
  • Marko Smith

    确定文本文件中每一行的字符数

    • 2 个回答
  • Marko Smith

    将接口对象传递给 JAVA 构造函数

    • 1 个回答
  • Marko Smith

    正确更新数据库中的数据

    • 1 个回答
  • Marko Smith

    Python解析不是css

    • 1 个回答
  • Martin Hope
    Alexandr_TT 2020年新年大赛! 2020-12-20 18:20:21 +0000 UTC
  • Martin Hope
    Alexandr_TT 圣诞树动画 2020-12-23 00:38:08 +0000 UTC
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5