簡體   English   中英

Python PyQt-多次運行函數時如何在另一個函數中編輯變量

[英]Python PyQt - How to edit a variable in another function when function is run multiple times

在我的PyQt5程序中,我具有選項卡,並使用一個功能多次創建相同的選項卡。 在PyQt中,要在單擊按鈕時運行代碼,需要將其連接到另一個功能。 在createATab函數中,我有一個QLineEdit,單擊一個按鈕時需要對其進行編輯。 這是我要執行的操作的一個示例:

class Example(QWidget, QWindow):
    def __init__(self):
        super().__init__()

        self.initUI()
    def runThisWhenButtonClicked(self):
        getText = editThisLine.text()
        editThisLine.clear() # edits variable in other function except other function is run multiple times
    def addTheTab(self, username):
        addingTab = QWidget()
        aButton = QPushButton("Stuff")
        editThisLine = QLineEdit()
        aButton.clicked.connect(self.runThisWhenButtonClicked)
        tabGrid = QGridLayout(addingTab)
        tabGrid.addWidget(editThisLine, 3, 1, 4, 2)
        tabGrid.addWidget(aButton, 3, 3, 4, 3)
        tab_widget.addTab(addingTab, str(username))    

    def initUI(self):
        global tab_widget
        tab_widget = QTabWidget()
        listwidget = QListWidget()
        listwidget.itemDoubleClicked.connect(self.addTheTab)
        splitterrr = QSplitter()
        splitterrr.addWidget(listwidget)
        splitterrr.addWidget(tab_widget)
        QListWidgetItem("Test1", listwidget)
        QListWidgetItem("Test2", listwidget)
        mainLayout = QHBoxLayout()
        mainLayout.addWidget(splitterrr)
        self.setLayout(mainLayout)
        self.setGeometry(300, 300, 300, 300)
        self.setWindowTitle('Test')
        self.show()


if __name__ == '__main__':
    app = QApplication(sys.argv)
    ex = Example()
    sys.exit(app.exec_())

如何通過引用傳遞變量?

我已經閱讀了這篇文章,盡管確實做了很多解釋,但是沒有解釋如何解決此問題。

pyqt4按鈕單擊處理程序

這說明了如何僅傳遞函數而不調用函數。 因此,無法將變量傳遞給runThisWhenButtonClicked函數。

您缺少的概念是閉包 閉包用函數包裝作用域,以便函數中的代碼可以訪問該關聯作用域內的變量。 連接信號時使用閉包的最簡單方法是使用lambda (盡管有些人喜歡使用functools.partial )。

在您的示例中,這意味着要像這樣連接信號:

    aButton.clicked.connect(lambda: self.runThisWhenButtonClicked(editThisLine))
    ...

def runThisWhenButtonClicked(self, editThisLine):
    print(editThisLine.text())

但是,我認為這可能是代碼中的“漏洞”,並且可能不是最佳解決方案。 更好的解決方案是正確使用類提供的名稱空間。 應該將addTheTabrunThisWhenButtonClicked重構為Tab類,並將其所有子小部件作為屬性:

class Tab(QWidget):
    def __init__(self, parent=None):
        super(Tab, self).__init__(parent)
        self.editThisLine = QLineEdit()
        self.aButton = QPushButton("Stuff")
        self.aButton.clicked.connect(self.runThisWhenButtonClicked)
        ...

    def runThisWhenButtonClicked(self):
        print(self.editThisLine.text())

這將完全消除示例中對閉包的需要。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM