简体   繁体   中英

How can I separate the displays and variables in each of my tabs in PyQt?

I am making a comics viewer but I have a problem.

So I have made a program that opens a new tab every time we click onto "File" and then "test". When we press on the right and left buttons on the tabs, the value of self.i (printed in the console) goes up and down.

However, the problem is that the value of self.i changes no matter the tab on which we push the left and right buttons, and the label I want to display if self.i == 1 only shows onto the last tab opened.

What I need is a way for each tab created to have their own self.i and the label to be displayed on any tab depending on their own self.i value. I can not figure out how to do this.

Here is the part that opens new tabs when "test" is clicked:

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)

Here is the part that shows a label when self.i equals to 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)

Here is my full program, you can try it, it works:

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_()

Here is the answer !

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_()

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM