在 PyQt5 中动态更改 GUI 元素?

Posted

技术标签:

【中文标题】在 PyQt5 中动态更改 GUI 元素?【英文标题】:Dynamically change GUI element in PyQt5? 【发布时间】:2018-06-11 16:58:18 【问题描述】:

假设我有一个带有一个按钮的 GUI。按下按钮后,它应该调用一个定义,该定义反过来在主 GUI 窗口中插入一个表。我的脚本如下所示,但按下按钮后,我看不到主 GUI 中插入任何表格。有什么想法吗?

from PyQt5.QtCore import QCoreApplication
from PyQt5.QtWidgets import QApplication, QWidget, QMainWindow, QPushButton, 
QLineEdit, QLabel, QComboBox, QFileDialog
import mydef

class window(QMainWindow):
    def __init__(self):
    super(window, self).__init__()
    self.setGeometry(50, 50, 500, 300)
    self.setWindowTitle('my test gui')

    #test button
    self.button = QPushButton('Insert table',self)
    self.button.move(5,20)
    self.button.clicked.connect(lambda: mydef.createtable(self))

    self.show()

def run():
    app = QApplication(sys.argv)
    gui = window()
    sys.exit(app.exec_())

run()

mydef 包含以下代码

def createtable(self):
from PyQt5.QtWidgets import QTableWidget, QTableWidgetItem
self.tablewidget = QTableWidget()
self.tablewidget.resize(500,200)
self.tablewidget.setRowCount(2)
self.tablewidget.setColumnCount(3)
self.tablewidget.setItem(0,0, QTableWidgetItem("item 1"))
self.show()

我不完全明白为什么它不插入表格,而且按下按钮时似乎没有任何错误。

【问题讨论】:

【参考方案1】:

您不能通过调用show() 方法将表添加到当前GUI。如果您对主窗口使用布局,您可以简单地将表格添加到布局中。

这是一个例子:

class GUITest(QtWidgets.QWidget):

    def __init__(self):
        QtWidgets.QWidget.__init__(self)

        self.layout = QtWidgets.QGridLayout()

        self.button = QtWidgets.QPushButton('Insert Table')
        self.button.clicked.connect(self.create_table)

        self.layout.addWidget(self.button)

        self.setLayout(self.layout)

    def create_table(self):
        self.tablewidget = QtWidgets.QTableWidget()
        self.tablewidget.resize(500, 200)
        self.tablewidget.setRowCount(2)
        self.tablewidget.setColumnCount(3)
        self.tablewidget.setItem(0, 0, QtWidgets.QTableWidgetItem("item 1"))

        self.layout.addWidget(self.tablewidget)  # add the table to the layout

如果必须按照您显示的方式从另一个类添加表格,您可以将布局提供给create_table 方法并使用与上述基本相同的方法。

def create_table(self, layout):
    # create table widget
    layout.addWidget(self.tablewidget)

【讨论】:

【参考方案2】:

试试看:

import sys
from PyQt5.QtCore    import QCoreApplication
from PyQt5.QtWidgets import (QApplication, QWidget, QMainWindow, QPushButton, 
                             QLineEdit, QLabel, QComboBox, QFileDialog)
import mydef

class window(QMainWindow):
    def __init__(self):
        super(window, self).__init__()
        self.setGeometry(50, 50, 500, 300)
        self.setWindowTitle('my test gui')

        #test button
        self.button = QPushButton('Insert table',self)
        self.button.move(5,20)
        #self.button.clicked.connect(lambda: mydef.createtable(self))
        self.button.clicked.connect(self.create_table)

        self.show()

    def create_table(self):
        self.myTable = mydef.createtable()
        self.myTable.show()


def run():
    app = QApplication(sys.argv)
    gui = window()
    sys.exit(app.exec_())

run()

mydef.py

from PyQt5.QtWidgets import QTableWidget, QTableWidgetItem

def createtable():
    tablewidget = QTableWidget()
    tablewidget.resize(500,200)
    tablewidget.setRowCount(2)
    tablewidget.setColumnCount(3)
    tablewidget.setItem(0,0, QTableWidgetItem("item 1"))

    return tablewidget

main_2.py

import sys
from PyQt5.QtCore    import QCoreApplication
from PyQt5.QtWidgets import (QApplication, QWidget, QMainWindow, QPushButton, QVBoxLayout,
                             QLineEdit, QLabel, QComboBox, QFileDialog)
import mydef

class window(QMainWindow):
    def __init__(self):
        super(window, self).__init__()
        self.setGeometry(50, 50, 500, 300)
        self.setWindowTitle('my test gui')

        self.central_widget = QWidget()               
        self.setCentralWidget(self.central_widget)    
        self.lay = QVBoxLayout(self.central_widget)

        #test button
        self.button = QPushButton('Insert table', self)
        self.button.move(5,20)
        #self.button.clicked.connect(lambda: mydef.createtable(self))
        self.button.clicked.connect(self.create_table)

        self.lay.addWidget(self.button)
        self.lay.addStretch(1)


        self.show()

    def create_table(self):
        self.myTable = mydef.createtable()

        self.lay.addWidget(self.myTable)
        self.lay.addStretch(1)


def run():
    app = QApplication(sys.argv)
    gui = window()
    sys.exit(app.exec_())

run()

【讨论】:

非常感谢代码修改。我现在正在研究它,我可以让它工作。是否可以在实际的 GUI 中而不是在单独的弹出窗口中显示表格?

以上是关于在 PyQt5 中动态更改 GUI 元素?的主要内容,如果未能解决你的问题,请参考以下文章

如何在pyqt5中连续插入2个以上的小部件

Python PyQt5 对话框元素仅显示 exec_ 而没有显示

在pyqt5中动态更改数据破折号

PyQt5 GUI 无法正确加载

在事件中动态更改 animateMotion SVG 元素的路径

Python 3.6.3:PyQt5 Matplotlib 条 x 最大面积。 10 项