我对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更好吗?还是有替代方案吗?
答案 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)