在 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 元素?的主要内容,如果未能解决你的问题,请参考以下文章
Python PyQt5 对话框元素仅显示 exec_ 而没有显示