如何在 PyQt 的每个选项卡中分隔显示和变量?
How can I separate the displays and variables in each of my tabs in PyQt?
我正在制作漫画查看器,但遇到了问题。
所以我制作了一个程序,每次我们点击 "File" 然后 "test" 时都会打开一个新选项卡。
当我们按下选项卡上的左右按钮时,self.i
(打印在控制台中)的值会上下移动。
但是,问题在于,无论我们在哪个选项卡上按下左右按钮,self.i
的值都会改变,而我要显示的标签 if self.i == 1
只显示在最后打开的标签页。
我需要的是一种方法,让创建的每个选项卡都有自己的 self.i
以及根据自己的 self.i
值在任何选项卡上显示的标签。我不知道该怎么做。
这是点击 "test" 时打开新标签页的部分:
def Open(self):
self.tab = QWidget()
self.tab.layout = QGridLayout()
self.nextpagebutton = QPushButton(">", self)
self.nextpagebutton.setFixedSize(50, 780)
self.tab.layout.addWidget(self.nextpagebutton, 0, 2)
self.nextpagebutton.clicked.connect(self.readnext)
self.prevpagebutton = QPushButton("<", self)
self.prevpagebutton.setFixedSize(50, 780)
self.tab.layout.addWidget(self.prevpagebutton, 0, 0)
self.prevpagebutton.clicked.connect(self.readprev)
self.n = int(self.n)+1
self.tabs.addTab(self.tab, "Tab "+str(self.n))
self.tab.setLayout(self.tab.layout)
这是self.i等于1时显示标签的部分:
def readnext(self):
self.i+=1
if self.i == 1:
self.label = QLabel("testtext")
self.tab.layout.addWidget(self.label, 0, 1)
print(self.i)
def readprev(self):
self.i-=1
if self.i == 1:
self.label = QLabel("testtext")
self.tab.layout.addWidget(self.label, 0, 1)
print(self.i)
这是我的完整程序,你可以试试,它有效:
import sys
from PyQt5.QtWidgets import QApplication, QMainWindow, QLabel, QGridLayout, QWidget, QPushButton, QAction, QStatusBar, QToolBar, QTabWidget
from PyQt5.QtCore import QCoreApplication
class FenetrePrincipale(QMainWindow):
def __init__(self):
super().__init__()
self.setWindowTitle("Liseuse de Bandes Dessinées")
self.left = 10
self.top = 10
self.width = 900
self.height = 850
self.i = 0
self.setGeometry(self.left, self.top, self.width, self.height)
self.toolbar = QToolBar("Toolbar")
self.layout = QGridLayout()
self.setCentralWidget(QWidget(self))
self.centralWidget().setLayout(self.layout)
self.move(200, 0)
self.addToolBar(self.toolbar)
self.table_widget = MyTableWidget(self)
self.open = QAction("test", self)
self.open.triggered.connect(self.table_widget.Open)
self.setStatusBar(QStatusBar())
self.menuFichier = self.menuBar().addMenu("&File")
self.menuFichier.addAction(self.open)
self.widget=QWidget()
self.widget.setLayout(self.layout)
self.setCentralWidget(self.widget)
self.setCentralWidget(self.table_widget)
self.show()
class MyTableWidget(QWidget):
def __init__(self, parent=None):
super(QWidget, self).__init__(parent)
self.layout = QGridLayout()
self.i = 0
self.n = 0
# Initialize tab screen
self.tabs = QTabWidget()
self.tabs.setDocumentMode(True)
self.tabs.setMovable(True)
# Add tabs to widget
self.layout.addWidget(self.tabs)
self.setLayout(self.layout)
def Open(self):
self.tab = QWidget()
self.tab.layout = QGridLayout()
self.nextpagebutton = QPushButton(">", self)
self.nextpagebutton.setFixedSize(50, 780)
self.tab.layout.addWidget(self.nextpagebutton, 0, 2)
self.nextpagebutton.clicked.connect(self.readnext)
self.prevpagebutton = QPushButton("<", self)
self.prevpagebutton.setFixedSize(50, 780)
self.tab.layout.addWidget(self.prevpagebutton, 0, 0)
self.prevpagebutton.clicked.connect(self.readprev)
self.n = int(self.n)+1
self.tabs.addTab(self.tab, "Tab "+str(self.n))
self.tab.setLayout(self.tab.layout)
def readnext(self):
self.i+=1
if self.i == 1:
self.label = QLabel("testtext")
self.tab.layout.addWidget(self.label, 0, 1)
print(self.i)
def readprev(self):
self.i-=1
if self.i == 1:
self.label = QLabel("testtext")
self.tab.layout.addWidget(self.label, 0, 1)
print(self.i)
app = QCoreApplication.instance()
if app is None:
app = QApplication(sys.argv)
window = FenetrePrincipale()
window.show()
app.exec_()
答案在这里!
import sys
from PyQt5.QtWidgets import QApplication, QMainWindow, QLabel, QGridLayout, QWidget, QPushButton, QAction, QStatusBar, QToolBar, QTabWidget
from PyQt5.QtCore import QCoreApplication
class FenetrePrincipale(QMainWindow):
def __init__(self):
super().__init__()
self.setWindowTitle("Liseuse de Bandes Dessinées")
self.left = 10
self.top = 10
self.width = 900
self.height = 850
self.i = 0
self.setGeometry(self.left, self.top, self.width, self.height)
self.toolbar = QToolBar("Toolbar")
self.layout = QGridLayout()
self.setCentralWidget(QWidget(self))
self.centralWidget().setLayout(self.layout)
self.move(200, 0)
self.addToolBar(self.toolbar)
self.table_widget = MyTableWidget(self)
self.open = QAction("test", self)
self.open.triggered.connect(self.table_widget.Open)
self.setStatusBar(QStatusBar())
self.menuFichier = self.menuBar().addMenu("&File")
self.menuFichier.addAction(self.open)
self.widget = QWidget()
self.widget.setLayout(self.layout)
self.setCentralWidget(self.widget)
self.setCentralWidget(self.table_widget)
self.show()
class MyTableWidget(QWidget):
def __init__(self, parent=None):
super(QWidget, self).__init__(parent)
self.layout = QGridLayout()
self.i = {} # your self.i is now a dict
self.n = 0
self.index = {}
self.tab = {}
# Initialize tab screen
self.tabs = QTabWidget()
self.tabs.setDocumentMode(True)
self.tabs.setMovable(True)
# Add tabs to widget
self.layout.addWidget(self.tabs)
self.setLayout(self.layout)
def Open(self):
n = str(self.n)
self.i[n] = 0 # assign new key as you make a tab
self.tab[n] = QWidget() # differentiate the tabs so we can call it back later when adding label
self.tab[n].objectName()
self.tab[n].layout = QGridLayout()
self.nextpagebutton = QPushButton(">", self)
self.nextpagebutton.setObjectName('>{}'.format(self.n)) # Give a unique name
self.nextpagebutton.setFixedSize(50, 780)
self.tab[n].layout.addWidget(self.nextpagebutton, 0, 2)
self.nextpagebutton.clicked.connect(self.readnext)
self.prevpagebutton = QPushButton("<", self)
self.prevpagebutton.setObjectName('<{}'.format(self.n)) # Give a unique name
self.prevpagebutton.setFixedSize(50, 780)
self.tab[n].layout.addWidget(self.prevpagebutton, 0, 0)
self.prevpagebutton.clicked.connect(self.readprev)
self.index[n] = self.tabs.addTab(self.tab[n], "Tab " + str(self.n))
self.tab[n].setLayout(self.tab[n].layout)
self.n = int(self.n) + 1
print(self.i)
def readnext(self):
name = str(self.sender().objectName()) # get the button's name
identifier = name[-1]
self.i[identifier] += 1
if self.i[identifier] == 1:
self.label = QLabel("testtext")
self.tab[identifier].layout.addWidget(self.label, 0, 1)
print(self.i)
def readprev(self):
name = str(self.sender().objectName()) # get the button's name
identifier = name[-1]
self.i[identifier] -= 1
if self.i[identifier] == 1:
self.label = QLabel("testtext")
self.tab[identifier].layout.addWidget(self.label, 0, 1)
print(self.i)
app = QCoreApplication.instance()
if app is None:
app = QApplication(sys.argv)
window = FenetrePrincipale()
window.show()
app.exec_()
我正在制作漫画查看器,但遇到了问题。
所以我制作了一个程序,每次我们点击 "File" 然后 "test" 时都会打开一个新选项卡。
当我们按下选项卡上的左右按钮时,self.i
(打印在控制台中)的值会上下移动。
但是,问题在于,无论我们在哪个选项卡上按下左右按钮,self.i
的值都会改变,而我要显示的标签 if self.i == 1
只显示在最后打开的标签页。
我需要的是一种方法,让创建的每个选项卡都有自己的 self.i
以及根据自己的 self.i
值在任何选项卡上显示的标签。我不知道该怎么做。
这是点击 "test" 时打开新标签页的部分:
def Open(self):
self.tab = QWidget()
self.tab.layout = QGridLayout()
self.nextpagebutton = QPushButton(">", self)
self.nextpagebutton.setFixedSize(50, 780)
self.tab.layout.addWidget(self.nextpagebutton, 0, 2)
self.nextpagebutton.clicked.connect(self.readnext)
self.prevpagebutton = QPushButton("<", self)
self.prevpagebutton.setFixedSize(50, 780)
self.tab.layout.addWidget(self.prevpagebutton, 0, 0)
self.prevpagebutton.clicked.connect(self.readprev)
self.n = int(self.n)+1
self.tabs.addTab(self.tab, "Tab "+str(self.n))
self.tab.setLayout(self.tab.layout)
这是self.i等于1时显示标签的部分:
def readnext(self):
self.i+=1
if self.i == 1:
self.label = QLabel("testtext")
self.tab.layout.addWidget(self.label, 0, 1)
print(self.i)
def readprev(self):
self.i-=1
if self.i == 1:
self.label = QLabel("testtext")
self.tab.layout.addWidget(self.label, 0, 1)
print(self.i)
这是我的完整程序,你可以试试,它有效:
import sys
from PyQt5.QtWidgets import QApplication, QMainWindow, QLabel, QGridLayout, QWidget, QPushButton, QAction, QStatusBar, QToolBar, QTabWidget
from PyQt5.QtCore import QCoreApplication
class FenetrePrincipale(QMainWindow):
def __init__(self):
super().__init__()
self.setWindowTitle("Liseuse de Bandes Dessinées")
self.left = 10
self.top = 10
self.width = 900
self.height = 850
self.i = 0
self.setGeometry(self.left, self.top, self.width, self.height)
self.toolbar = QToolBar("Toolbar")
self.layout = QGridLayout()
self.setCentralWidget(QWidget(self))
self.centralWidget().setLayout(self.layout)
self.move(200, 0)
self.addToolBar(self.toolbar)
self.table_widget = MyTableWidget(self)
self.open = QAction("test", self)
self.open.triggered.connect(self.table_widget.Open)
self.setStatusBar(QStatusBar())
self.menuFichier = self.menuBar().addMenu("&File")
self.menuFichier.addAction(self.open)
self.widget=QWidget()
self.widget.setLayout(self.layout)
self.setCentralWidget(self.widget)
self.setCentralWidget(self.table_widget)
self.show()
class MyTableWidget(QWidget):
def __init__(self, parent=None):
super(QWidget, self).__init__(parent)
self.layout = QGridLayout()
self.i = 0
self.n = 0
# Initialize tab screen
self.tabs = QTabWidget()
self.tabs.setDocumentMode(True)
self.tabs.setMovable(True)
# Add tabs to widget
self.layout.addWidget(self.tabs)
self.setLayout(self.layout)
def Open(self):
self.tab = QWidget()
self.tab.layout = QGridLayout()
self.nextpagebutton = QPushButton(">", self)
self.nextpagebutton.setFixedSize(50, 780)
self.tab.layout.addWidget(self.nextpagebutton, 0, 2)
self.nextpagebutton.clicked.connect(self.readnext)
self.prevpagebutton = QPushButton("<", self)
self.prevpagebutton.setFixedSize(50, 780)
self.tab.layout.addWidget(self.prevpagebutton, 0, 0)
self.prevpagebutton.clicked.connect(self.readprev)
self.n = int(self.n)+1
self.tabs.addTab(self.tab, "Tab "+str(self.n))
self.tab.setLayout(self.tab.layout)
def readnext(self):
self.i+=1
if self.i == 1:
self.label = QLabel("testtext")
self.tab.layout.addWidget(self.label, 0, 1)
print(self.i)
def readprev(self):
self.i-=1
if self.i == 1:
self.label = QLabel("testtext")
self.tab.layout.addWidget(self.label, 0, 1)
print(self.i)
app = QCoreApplication.instance()
if app is None:
app = QApplication(sys.argv)
window = FenetrePrincipale()
window.show()
app.exec_()
答案在这里!
import sys
from PyQt5.QtWidgets import QApplication, QMainWindow, QLabel, QGridLayout, QWidget, QPushButton, QAction, QStatusBar, QToolBar, QTabWidget
from PyQt5.QtCore import QCoreApplication
class FenetrePrincipale(QMainWindow):
def __init__(self):
super().__init__()
self.setWindowTitle("Liseuse de Bandes Dessinées")
self.left = 10
self.top = 10
self.width = 900
self.height = 850
self.i = 0
self.setGeometry(self.left, self.top, self.width, self.height)
self.toolbar = QToolBar("Toolbar")
self.layout = QGridLayout()
self.setCentralWidget(QWidget(self))
self.centralWidget().setLayout(self.layout)
self.move(200, 0)
self.addToolBar(self.toolbar)
self.table_widget = MyTableWidget(self)
self.open = QAction("test", self)
self.open.triggered.connect(self.table_widget.Open)
self.setStatusBar(QStatusBar())
self.menuFichier = self.menuBar().addMenu("&File")
self.menuFichier.addAction(self.open)
self.widget = QWidget()
self.widget.setLayout(self.layout)
self.setCentralWidget(self.widget)
self.setCentralWidget(self.table_widget)
self.show()
class MyTableWidget(QWidget):
def __init__(self, parent=None):
super(QWidget, self).__init__(parent)
self.layout = QGridLayout()
self.i = {} # your self.i is now a dict
self.n = 0
self.index = {}
self.tab = {}
# Initialize tab screen
self.tabs = QTabWidget()
self.tabs.setDocumentMode(True)
self.tabs.setMovable(True)
# Add tabs to widget
self.layout.addWidget(self.tabs)
self.setLayout(self.layout)
def Open(self):
n = str(self.n)
self.i[n] = 0 # assign new key as you make a tab
self.tab[n] = QWidget() # differentiate the tabs so we can call it back later when adding label
self.tab[n].objectName()
self.tab[n].layout = QGridLayout()
self.nextpagebutton = QPushButton(">", self)
self.nextpagebutton.setObjectName('>{}'.format(self.n)) # Give a unique name
self.nextpagebutton.setFixedSize(50, 780)
self.tab[n].layout.addWidget(self.nextpagebutton, 0, 2)
self.nextpagebutton.clicked.connect(self.readnext)
self.prevpagebutton = QPushButton("<", self)
self.prevpagebutton.setObjectName('<{}'.format(self.n)) # Give a unique name
self.prevpagebutton.setFixedSize(50, 780)
self.tab[n].layout.addWidget(self.prevpagebutton, 0, 0)
self.prevpagebutton.clicked.connect(self.readprev)
self.index[n] = self.tabs.addTab(self.tab[n], "Tab " + str(self.n))
self.tab[n].setLayout(self.tab[n].layout)
self.n = int(self.n) + 1
print(self.i)
def readnext(self):
name = str(self.sender().objectName()) # get the button's name
identifier = name[-1]
self.i[identifier] += 1
if self.i[identifier] == 1:
self.label = QLabel("testtext")
self.tab[identifier].layout.addWidget(self.label, 0, 1)
print(self.i)
def readprev(self):
name = str(self.sender().objectName()) # get the button's name
identifier = name[-1]
self.i[identifier] -= 1
if self.i[identifier] == 1:
self.label = QLabel("testtext")
self.tab[identifier].layout.addWidget(self.label, 0, 1)
print(self.i)
app = QCoreApplication.instance()
if app is None:
app = QApplication(sys.argv)
window = FenetrePrincipale()
window.show()
app.exec_()