【问题标题】:How can I separate the displays and variables in each of my tabs in PyQt?如何在 PyQt 中的每个选项卡中分离显示和变量?
【发布时间】:2020-09-07 06:06:35
【问题描述】:

我正在制作漫画查看器,但我遇到了问题。

所以我制作了一个程序,每次单击“文件”然后单击“测试”时都会打开一个新选项卡。 当我们按下选项卡上的左右按钮时,self.i(在控制台中打印)的值会上下波动。

但是,问题是self.i 的值无论我们在哪个选项卡上按左右按钮都会发生变化,而我要显示的标签if self.i == 1 只显示在最后一个打开的选项卡上。

我需要一种方法,让创建的每个选项卡都有自己的self.i,并且标签根据它们自己的self.i 值显示在任何选项卡上。我不知道该怎么做。

这是单击“测试”时打开新标签的部分:

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

【问题讨论】:

    标签: python class user-interface pyqt tabs


    【解决方案1】:

    这就是答案!

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

    【讨论】:

      猜你喜欢
      • 2018-04-26
      • 1970-01-01
      • 2017-03-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-01-28
      相关资源
      最近更新 更多