Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/flutter/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 2.7 PySide-QStackedLayout.setCurrentIndex()在';它在for循环中_Python 2.7_Pyside - Fatal编程技术网

Python 2.7 PySide-QStackedLayout.setCurrentIndex()在';它在for循环中

Python 2.7 PySide-QStackedLayout.setCurrentIndex()在';它在for循环中,python-2.7,pyside,Python 2.7,Pyside,我正在实现一个UI,它在顶部包含几个按钮,在这些按钮下面有一个QStackedLayout对象,单击不同按钮的目的应该自动切换到它的相关QWidget,它位于QStackedLayout对象内部。动态添加按钮数量及其关联的QWidget 例如,这里我想实现一个包含两个按钮“a”和“b”的简单窗口,理想情况下,当单击“a”按钮时,您应该看到下面的标签“a”,这意味着QStackedLayout被设置为包含QLabel“a”的适当小部件,类似的规则也应该适用于按钮“b”。所以我写了以下代码: imp

我正在实现一个UI,它在顶部包含几个按钮,在这些按钮下面有一个QStackedLayout对象,单击不同按钮的目的应该自动切换到它的相关QWidget,它位于QStackedLayout对象内部。动态添加按钮数量及其关联的QWidget

例如,这里我想实现一个包含两个按钮“a”和“b”的简单窗口,理想情况下,当单击“a”按钮时,您应该看到下面的标签“a”,这意味着QStackedLayout被设置为包含QLabel“a”的适当小部件,类似的规则也应该适用于按钮“b”。所以我写了以下代码:

import sys

from PySide.QtCore import *
from PySide.QtGui import * 

class main_gui(QWidget):

    def __init__(self, parent = None):
        super(main_gui, self).__init__(parent)

        #create a root level widget 
        self.main_widget = QWidget()
        #create a root level layout that holds all the child widgets
        self.main_layout = QVBoxLayout(self.main_widget)      

        # widgets for buttons layout
        self.asset_type_buttons_widget = QWidget()
        # layout for all buttons
        self.asset_type_buttons_layout = QHBoxLayout(self.asset_type_buttons_widget)

        # now create the stack layout
        self.asset_stacked_widget = QWidget()
        self.asset_stacked_layout = QStackedLayout(self.asset_stacked_widget)

        # add the buttons and stack layout into the root level layout
        self.main_layout.addWidget(self.asset_type_buttons_widget)
        self.main_layout.addWidget(self.asset_stacked_widget)    

        #dynamically adds buttons and stacked widgets, here we're going to add 2 buttons, which their labels are 'a' and 'b'
        self.create_asset_sections(self.asset_stacked_layout, self.asset_type_buttons_layout, 'a','b')    

        self.main_widget.show()

    def create_asset_sections(self, stack_layout, parent_buttons_layout, *asset_types):
        # asset_types represents any arbitrary number of buttons and their associated stacked widgets
        for type in asset_types:

            index = asset_types.index(type)

            self.type_top_button = QPushButton(type)

            parent_buttons_layout.addWidget(self.type_top_button)     

            self.type_top_widget = QWidget()
            self.type_top_layout = QVBoxLayout(self.type_top_widget)

            i = stack_layout.insertWidget(index, self.type_top_widget)   

            self.test_label = QLabel(type)
            self.type_top_layout.addWidget(self.test_label)

            self.type_top_button.clicked.connect(lambda: stack_layout.setCurrentIndex(i))

app = QApplication(sys.argv)         
gui = main_gui()          
app.exec_()
但执行上述代码时,您应该注意到标签“a”只出现一次,然后无论您单击按钮“a”或按钮“b”,标签“b”始终显示在按钮下方

我还尝试修改代码,然后使用QStackedLayout.setCurrentWidget()方法,这里是create_asset_sections()的另一个版本

所以用上面的方法来代替以前的方法也无助于达到我最初的目的

有什么想法吗?提前感谢您的回答。

请看此。这是一个不同的问题,但他们有着本质上相同的问题。这条线就是问题所在

self.type_top_button.clicked.connect(lambda: stack_layout.setCurrentIndex(i))
具体地

lambda: stack_layout.setCurrentIndex(i)
问题是创建lambda函数时,
i
的值没有计算。在调用lambda函数时对其进行评估,到那时,循环已经完成,每个
lambda
将在循环结束时使用完全相同的
i
值,而不是创建
lambda
时的
i

有两种方法可以解决这个问题。第一种方法是在
lambda
中使用默认参数,这将强制在函数创建时计算
i
的值

lambda i=i: stack_layout.setCurrentIndex(i) 
或者,您可以使用
functools.partial

from functools import partial

self.type_top_button.clicked.connect(partial(layout.setCurrentIndex, i))

如果我不使用for循环,我只能在上面的示例中实现我想要的。事实上,这只是我应用程序的一部分,我不能在应用程序中动态添加按钮和小部件
from functools import partial

self.type_top_button.clicked.connect(partial(layout.setCurrentIndex, i))