python - PyQt5 - 具有相同对象的选项卡
问题描述
所以我不想为任何选项卡使用布局。我将使用 .setGeometry 来放置对象,因为要放置许多对象 :)
问题是:在 Tab1.py 和 Tab2.py 中创建的任何对象都出现在所有选项卡上。
- Tab3.py 代码与 Tab2.py 相同(只是一个按钮)
我相信问题出在父/子代码上,但不确定我是否出错了。任何指导将不胜感激。 你也可以忽略一些导入,我只是还没有得到那个代码:)
主窗口.py
import os, sys, subprocess, atexit, PyQt5, pyodbc, time, datetime, getpass, csv, xlsxwriter
import Tab1, Tab2, Tab3
from PyQt5.QtWidgets import QApplication, QTabBar, QLayout, QLabel, QLineEdit, QMainWindow, QTabWidget, QWidget, QPushButton, QHBoxLayout, QVBoxLayout, QGroupBox, QRadioButton, QTextEdit, QCheckBox, QInputDialog, QFileDialog, QProgressBar, QTableWidget, QTableWidgetItem
from PyQt5.QtCore import *
class MainWindow(QMainWindow):
# define main window size and position on screen
def __init__(MainWindow, parent=None):
super().__init__()
MainWindow.left = 50
MainWindow.top = 50
MainWindow.width = 720
MainWindow.height = 600
MainWindow.setGeometry(MainWindow.left,
MainWindow.top,
MainWindow.width,
MainWindow.height)
MainWindow.table_widget = MainWindowWidget(MainWindow)
MainWindow.setCentralWidget(MainWindow.table_widget)
MainWindowWidget()
class MainWindowWidget(QWidget):
def __init__(self, parent=None):
super(QWidget, self).__init__(parent)
# configure layout
self.layout = QVBoxLayout(self)
self.setLayout(self.layout)
# initialize tab screen
self.tabs = QTabWidget()
self.tab1 = QWidget()
self.tab2 = QWidget()
self.tab3 = QWidget()
self.layout.addWidget(self.tabs)
# add tabs
self.tabs.addTab(self.tab1, "Tab1")
self.tabs.addTab(self.tab2, "Tab2")
self.tabs.addTab(self.tab2, "Tab3")
# create first tab
Tab1.Tab1.CreateTab1(self)
Tab2.Tab2.CreateTab2(self)
Tab3.Tab3.CreateTab3(self)
def exit_handler(self):
print('closing application')
atexit.register(exit_handler(self))
# create main window and show it
if __name__ == '__main__':
app = QApplication(sys.argv)
MainWindow = MainWindow()
MainWindow.show()
sys.exit(app.exec_())
Tab1.py
from PyQt5.QtWidgets import QApplication, QLabel, QLineEdit, QMainWindow, QTabWidget, QWidget, QPushButton, QHBoxLayout, \
QVBoxLayout, QGroupBox, QRadioButton, QTextEdit, QCheckBox, QInputDialog, QFileDialog, QProgressBar, QTableWidget, \
QTableWidgetItem, QComboBox
import MainWindow
class Tab1(QMainWindow):
def CreateTab1(tab1, parent=None):
# reference number input box
tab1.label_input_reference_number = QLabel(tab1)
tab1.label_input_reference_number.setText('Reference Number')
tab1.label_input_reference_number.setGeometry(25, 80, 115, 20)
tab1.input_reference_number = QLineEdit(tab1)
tab1.input_reference_number.setGeometry(170, 80, 215, 20)
# add CheckGroupButton
tab1.Button = QPushButton(tab1)
tab1.Button.setText("Button")
tab1.Button.setGeometry(385, 105, 100, 20)
选项卡2.py
from PyQt5.QtWidgets import QApplication, QLabel, QLineEdit, QMainWindow, QTabWidget, QWidget, QPushButton, QHBoxLayout, QGroupBox, QRadioButton, QTextEdit, QCheckBox, QInputDialog, QFileDialog, QProgressBar, QTableWidget, QTableWidgetItem
class Tab2(QMainWindow):
def CreateTab2(tab2):
# add button
tab2.Button = QPushButton(tab2)
tab2.Button.setText("Another button")
tab2.Button.setGeometry(300, 585, 100, 20)
解决方案
你的问题在这里:
self.tabs.addTab(self.tab1, "Tab1")
self.tabs.addTab(self.tab2, "Tab2")
self.tabs.addTab(self.tab2, "Tab3")
# create first tab
Tab1.Tab1.CreateTab1(self)
Tab2.Tab2.CreateTab2(self)
Tab3.Tab3.CreateTab3(self)
您拥有由父级拥有的所有选项卡控件。(另外,你有两次 tab2 。)你想要:
self.tabs.addTab(self.tab1, "Tab1")
self.tabs.addTab(self.tab2, "Tab2")
self.tabs.addTab(self.tab3, "Tab3")
Tab1.Tab1.CreateTab1(tab1)
Tab2.Tab2.CreateTab2(tab2)
Tab3.Tab3.CreateTab3(tab3)
但是,这是一种奇怪的方法。你应该有Tab1
,Tab2
并Tab3
从 QWidget 派生,并这样做:
self.tab1 = Tab1.Tab1()
self.tab2 = Tab2.Tab2()
self.tab3 = Tab3.Tab3()
这样,你就不需要一个奇怪的类方法来配置东西了。
推荐阅读
- ssl - Apache Tomcat 8.5:在 IE 中启用 SSL,但在 Chrome 中未启用
- c# - nLog 记录会话变量始终为空
- xml - XSL 转换 - 使用来自在线资源的 XML
- postgresql - 使用 AWS-Lambda 和 Typeorm 部署环境写入 Postgres DB 时,如何修复“错误:关系“queList”不存在”?
- coldfusion - Fedex 取件服务中的身份验证失败
- android - 使用自定义通知时如何以编程方式将视图添加到通知(添加到 RemoveViews)
- laravel - 如何从刀片中的 eloquent 过滤器中提取数据
- jquery - 当我们使用数据表 pdf 按钮打印数据表时,无法获取 pdf 格式的数据表图像。它只显示空数据而不是图像
- orbeon - 如何删除重复网格的插入下拉菜单的 Orbeon 表单外观
- java - @OnTimer 在窗口后未触发