使用来自其他功能的变量而不使用"运行"功能(Python Qt)

时间:2017-03-24 09:15:38

标签: python pyqt

我对Python很新,我有一个关于将变量从一个函数传递给另一个函数的问题(在PyQt脚本中)。

这是我的剧本:

from PyQt4 import QtCore, QtGui
import analysefuncties
import os

try:
    _fromUtf8 = QtCore.QString.fromUtf8
except AttributeError:
    def _fromUtf8(s):
        return s

try:
    _encoding = QtGui.QApplication.UnicodeUTF8
    def _translate(context, text, disambig):
        return QtGui.QApplication.translate(context, text, disambig, _encoding)
except AttributeError:
    def _translate(context, text, disambig):
        return QtGui.QApplication.translate(context, text, disambig)

class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName(_fromUtf8("MainWindow"))
        MainWindow.resize(581, 631)
        self.centralwidget = QtGui.QWidget(MainWindow)
        self.centralwidget.setObjectName(_fromUtf8("centralwidget"))
        self.listWidget_vars = QtGui.QListWidget(self.centralwidget)
        self.listWidget_vars.setGeometry(QtCore.QRect(10, 40, 211, 531))
        #self.listWidget_vars.setAcceptDrops(True)
        self.listWidget_vars.setDragEnabled(True)
        self.listWidget_vars.setDragDropMode(QtGui.QAbstractItemView.DragOnly)
        self.listWidget_vars.setObjectName(_fromUtf8("listWidget_vars"))
        self.label = QtGui.QLabel(self.centralwidget)
        self.label.setGeometry(QtCore.QRect(20, 10, 101, 20))
        self.label.setObjectName(_fromUtf8("label"))
        self.listWidget_2 = QtGui.QListWidget(self.centralwidget)
        self.listWidget_2.setGeometry(QtCore.QRect(300, 40, 256, 41))
        self.listWidget_2.setAcceptDrops(True)
        self.listWidget_2.setDragDropMode(QtGui.QAbstractItemView.DropOnly)
        self.listWidget_2.setObjectName(_fromUtf8("listWidget_2"))
        self.pushButton = QtGui.QPushButton(self.centralwidget)
        self.pushButton.setGeometry(QtCore.QRect(300, 540, 141, 28))
        self.pushButton.setObjectName(_fromUtf8("pushButton"))
        self.pushButton_2 = QtGui.QPushButton(self.centralwidget)
        self.pushButton_2.setGeometry(QtCore.QRect(470, 540, 90, 28))
        self.pushButton_2.setObjectName(_fromUtf8("pushButton_2"))
        MainWindow.setCentralWidget(self.centralwidget)
        self.menubar = QtGui.QMenuBar(MainWindow)
        self.menubar.setGeometry(QtCore.QRect(0, 0, 581, 26))
        self.menubar.setObjectName(_fromUtf8("menubar"))
        self.menuBestand = QtGui.QMenu(self.menubar)
        self.menuBestand.setObjectName(_fromUtf8("menuBestand"))
        MainWindow.setMenuBar(self.menubar)
        self.statusbar = QtGui.QStatusBar(MainWindow)
        self.statusbar.setObjectName(_fromUtf8("statusbar"))
        MainWindow.setStatusBar(self.statusbar)
        self.actionSelecteer_bestand = QtGui.QAction(MainWindow)
        self.actionSelecteer_bestand.setObjectName(_fromUtf8("actionSelecteer_bestand"))
        self.actionSluit_programma = QtGui.QAction(MainWindow)
        self.actionSluit_programma.setObjectName(_fromUtf8("actionSluit_programma"))
        self.menuBestand.addAction(self.actionSelecteer_bestand)
        self.menuBestand.addAction(self.actionSluit_programma)
        self.menubar.addAction(self.menuBestand.menuAction())

        self.retranslateUi(MainWindow)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)

        #bind functies aan knoppen
        self.actionSelecteer_bestand.triggered.connect(self.OpenBestand)
        self.pushButton.clicked.connect(self.StartAnalyse)

    def retranslateUi(self, MainWindow):
        MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow", None))
        self.pushButton.setText(_translate("MainWindow", "Start analyse", None))
        self.pushButton_2.setText(_translate("MainWindow", "Reset", None))
        self.menuBestand.setTitle(_translate("MainWindow", "Bestand", None))
        self.actionSelecteer_bestand.setText(_translate("MainWindow", "Selecteer bestand", None))
        self.actionSluit_programma.setText(_translate("MainWindow", "Sluit programma", None))

    def OpenBestand(self):
        bestand = str(QtGui.QFileDialog.getOpenFileName(None, "Selecteer dataset"))

    def StartAnalyse(self):
        # use 'bestand' from other function, e.g.:
        dataset = bestand
        print dataset

if __name__ == "__main__":
    import sys
    app = QtGui.QApplication(sys.argv)
    MainWindow = QtGui.QMainWindow()
    ui = Ui_MainWindow()
    ui.setupUi(MainWindow)
    MainWindow.show()
    sys.exit(app.exec_())

在" OpenBestand()"我让用户选择一个文件。我想在另一个函数中使用此文件(路径+名称)执行某些操作:StartAnalyse。但我不能像上面脚本那样做。

可以做的是从OpenBestand()返回变量并从StartAnalyse()调用它:

def OpenBestand(self):
    bestand = str(QtGui.QFileDialog.getOpenFileName(None, "Selecteer dataset"))
    return bestand

def StartAnalyse(self):

    dataset = OpenBestand()
    print dataset

但现在,每次我点击与“StartAnalyse”相关的按钮时,功能' OpenBestand()'跑步,我不想要那样。该功能属于另一个按钮。

所以我想出了两个解决方案。 解决方案1:使变量“最佳”和“#39;在OpenBestand()global:

def OpenBestand(self):
    global bestand
    bestand = str(QtGui.QFileDialog.getOpenFileName(None, "Selecteer dataset"))


def StartAnalyse(self):
    dataset = bestand
    print dataset # and do stuff with variable (put it in another function)

解决方案2:将OpenBestand()中的路径和文件名放在一个临时文件中,并在关闭应用程序时在StartAnalyse()(和os.remove(' temfile.txt')中)读取此文件:

def OpenBestand(self):
    bestand = str(QtGui.QFileDialog.getOpenFileName(None, "Selecteer dataset"))

    tempf = open('tempfile.txt','w')
    tempf.write(bestand)
    tempf.close()

def StartAnalyse(self):

    tempf = open('tempfile.txt','r')
    dataset = tempf.read()
    tempf.close()

    print dataset

我在这个论坛上宣读过宣布全局变量是危险的。解决方案2更好吗?还是有替代方案吗?

1 个答案:

答案 0 :(得分:1)

你应该尽可能避免使用全局变量。在这里,你可以。

由于您处于同一个对象(在实例方法中标识为self),最好的方法可能是使用" private" (name-mangled)成员来存储值(因此它不容易从对象外部看到),并从另一个方法中调用它。

__init__(self)添加self.__bestand = None,以便定义

然后在OpenBestand方法中,指定它:

self.__bestand = str(QtGui.QFileDialog....

并在StartAnalyse中,测试一下是否正确设置并使用它:

if self.__bestand: # empty or None: won't pass
   # do something
   print(self.__bestand)