2013-12-11 54 views
1

我有一個很難用這樣的: ,就像我跟PyQt的編程GUI的我想構建自己的工作:子程序這需要所有預定義變量從「主程序」

我有我的GUI幾個按鈕應該用scikitlearn從我的計算中調用「不同的子程序」。

我有用於預測的鍵「PRED」,另一個用於一些曲線稱爲「PLOT」

當這些按鈕被點擊一個python「計算程序」被稱爲與

class MyDia(QtGui.QDialog, Dlg): 
    def __init__(self): 
     QtGui.QDialog.__init__(self) 
     self.setupUi(self) 

     self.connect(self.buttonOPLOT, 
       QtCore.SIGNAL("clicked()"), self.onPLOT)  
     self.connect(self.buttonPRED, 
       QtCore.SIGNAL("clicked()"), self.onPRED) 
    def onPRED 
     if self.button_1.checkState(): 
      a=1 
     if self.button_2.checkState(): 
      a=2 
     query=np.zeros((1,18)) 
     for i in range(0,18,1): 
      try: 
       query[0,i]= float(self.tableWidget.item(0,i).text()) 

     ### when user has made his choices the data goes do this 
     from sk_calc import main, pred 
     main() #after main, "pred" should be called with some definitions that 
     have been made in "main" 
     pred(a) #a is some parameter of a regression (i try to keep it easy) 

在現在我在不同的文件中使用不同的「計算」程序「sk_plot和sk_pred」 - 目標是僅更改一個...其中「main」在特定作業(PRED或PLOT ...)之前運行...

THE UNIQUE計算程序應該「看起來」/被構造成類似於這樣的:

def main(): 
    import numpy as np 
    import #all modules from scikitlearn 

    DATA=np.genfromtxt(direc+"\some.csv",delimiter=";",dtype=float ,skip_header=2, usecols=range(0,22)) #reading in a csv file with my data 

    features=DATA[:,4:22]#the "X" of my DATA 
    targets=DATA[:,1]#the "Y" of my DATA 

    svr_rbf = SVR(kernel='rbf', C=2e4, gamma=a) #Regression using the DATA #a comes from user click 
    svr_rbf.fit(features, targets).predict(features)# method of scikit-learn 

     def pred(): 
      Prediction=svr_rbf.predict(query) 
      #query is defined by the user in the gui typing in some values 
      print(Pred_ic) 

     def plot(): 
      #... something different using pylab but ALSO DATA features and targets 

你看到我想要的一些代碼(主)unindependantly運行whick按鈕被點擊 ,「計算計劃」應執行有變量和數據在主定義的後一部分() 。

我爲此使用課堂嗎?如果是的話,我必須記住什麼?這是什麼步驟...

+0

你能概括你的問題?就像,你究竟需要什麼。從函數中導入變量?將變量傳遞給正在運行的腳本? – aIKid

+0

當我運行一個函數的「小節」時,我希望在函數的main()函數中定義的所有東西都可以在本小節中找到 - 變量名稱,值等... – Hiatus

回答

1

你是正確的,類是一種很好的方式來構建你的代碼。

一個類可以保持自己的狀態,並且具有可以通過方法和屬性操作的預定義行爲。

但是,我不會給出有關使用類的一般建議,因爲這是針對特定編程問題的stackoverflow的主題。如果你想知道更多,只要做一個關於這個主題的python書籍/教程的網頁搜索 - 那裏有幾十個好書。

相反,我會盡我所能重新構造您的問題中的代碼以使用類。以下代碼僅適用於圖示目的。它是而不是意思是一個完整的,可運行的例子。希望有足夠的提示,有給你如何進行一個想法:

gui.py

import numpy as np 
import sk_calc 

class MyDia(QtGui.QDialog, Dlg): 
    def __init__(self): 
     QtGui.QDialog.__init__(self) 
     self.setupUi(self) 
     self.buttonOPLOT.clicked.connect(self.onPLOT) 
     self.buttonPRED.clicked.connect(self.onPRED) 

    def onPRED(self): 
     if self.button_1.isChecked(): 
      a = 1 
     elif self.button_2.isChecked(): 
      a = 2 
     else: 
      a = 0 
     query = np.zeros((1,18)) 
     # ... etc 

     # when user has made his choices the data goes do this 

     # create an instance of the Calc class, passing in 
     # parameters from the gui 
     calc = sk_calc.Calc(a) 

     # call methods of the instance, passing in parameters 
     # from the gui, and receiving returned values 
     prediction = calc.pred(query) 

     # calc.plot() ... etc 

sk_calc.py

import numpy as np 
from sklearn.svm import SVR 
# import other stuff from scikitlearn 

DEFAULT_CSVPATH = 'path/to/some/file.csv' 

class Calc(object): 
    def __init__(self, a, csvpath=None): 
     if csvpath is None: 
      csvpath = DEFAULT_CSVPATH 
     # reading in a csv file with my data 
     self.data = np.genfromtxt(
      csvpath , delimiter=';', dtype=float, 
      skip_header=2, usecols=range(0,22)) 

     self.features = data[:,4:22] # the "X" of my DATA 
     self.targets = data[:,1]  # the "Y" of my DATA 

     # Regression using the DATA, a comes from user click 
     self.svr_rbf = SVR(kernel='rbf', C=2e4, gamma=a) 

     # method of scikit-learn 
     self.svr_rbf.fit(features, targets).predict(features) 

    def pred(self, query): 
     # query is defined by the user in the gui typing in some values 
     prediction = self.svr_rbf.predict(query) 
     return prediction 

    def plot(self): 
     # ... use pylab with DATA features and targets 
     # self.data ... 
     # self.features ... 
+0

感謝您的努力,我會閱讀更多關於課程和嘗試你的方法! – Hiatus

+0

謝謝!!,完成這項工作並沒有太多的工作 - 我基本上不得不添加一個「自我」。到處都使用了在「__init__」部分中定義的變量 – Hiatus

相關問題