简体   繁体   English

如何在 PyQt 中的每个选项卡中分离显示和变量?

[英]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.当我们按下选项卡上的左右按钮时, self.i的值(打印在控制台中)会上下波动。

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.但是,问题是self.i的值会发生变化,无论我们在哪个选项卡上按下左右按钮, if self.i == 1仅显示在最后一个打开的选项卡上,我想显示的 label 。

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.我需要的是一种方法,让创建的每个选项卡都有自己的self.i和 label 根据它们自己的self.i值显示在任何选项卡上。 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:这是当 self.i 等于 1 时显示 label 的部分:

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 如何将PyQt4中的标签页添加到文本编辑器中? - How can I add tabs from PyQt4 to my text editor? 如何将图像(或文本)添加到没有选项卡的 pyqt5 QtabWidget? - How can I add an image (or text) to a pyqt5 QtabWidget with no tabs? 如何从数据集中分离一行,但在每一行中重复一些变量? - How can I separate one row from a data set but repeat in each line some of the variables? 如何分离字符串并将其转换为变量 - How can I separate a string and turn it into variables 如何在彼此之上添加 pyqt5 按钮? - How can I add pyqt5 buttons on top of each other? 如何将 python 字典的每个键值对存储在 json 文件中的单独行上? - How can I store each key-value pair of my python dictionary on a separate line in json file? 如何为我的 pandas Z6A8000755DF47794C55555 上的每个名称制作单独的 excel 表(在 1 个 excel 文件中) - How can I make separate excel sheets (in 1 excel file) for each Name on my pandas dataframe? 它显示我的一个变量没有定义,当我看到它是 - It displays that one of my variables is not defined when from what i can see it is 如何将变量相互关联? - How can I associate variables with each other? pyqt - 如何确保我的所有计算都在单独的 Qthread 中运行? - pyqt - How do I ensure that all my calculations are running in a separate Qthread?
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM