2011-09-14 75 views
-1

我正在嘗試編寫一個GUI可搜索的細菌數據庫,其中使用tkinter python 2.7嵌入代碼中的數據庫數組。通過單選按鈕選擇某些標準選擇性地搜索數組,然後點擊'識別'按鈕應該打印出與所選擇的細菌相匹配的所有細菌的標識作爲標籤。如何綁定數組數據的單選按鈕選擇

我已經發布了下面的非功能代碼段[idbuttonclick(self)]。

什麼代碼段DEF idbuttonclick(個體)是應該做的:

1)搜索矩陣/陣列命名爲「數據」的哪些列1-4表示一個單選按鈕字符串變量選項和各行的細菌ID

2)「數據」,其可變選項匹配單選按鈕選擇

3)從選擇的行打印數據列0細菌ID作爲在self.id_frame一個標籤選擇行如果數量ID是1-20。否則,打印消息標籤「錯誤:數據不足」。

def idbuttonclick(self): 

    def column(matrix, i): 

     if column(data, 1)!=self.gram_option.get(): line.destroy() 
     if column(data, 2)!=self.meta_option.get(): line.destroy() 
     if column(data, 3)!=self.cat_option.get(): line.destroy() 
     if column(data, 4)!=self.oxi_option.get(): line.destroy() 

     column(data, 0)==id 

    if id.count >= 20 or id.count == 0: 
     Label(self.id_frame, text = "Error: Not enough data", background = "white").pack(side=TOP, anchor = N) 
    else: Label(self.id_frame, text = id, background = "white").pack(side=TOP, anchor = N) 

我已經得到的代碼給我id.frame標籤基於單選按鈕的選擇,但仍不能鏈接單選按鈕選擇在數組中座標然後提供基於該單選按鈕id.frame標籤/數組座標匹配。

它現在特別是一個數組,而不是矩陣,因爲矩陣和列表和元組列表顯然不能使用座標索引(i,j)存儲元素。

下面是我的新草案,其中包括數組和idbutton點擊命令。

這應該如何工作: 如果單選按鈕self.gram_option =('+'),則數組列1中在同一行內的數組列2中具有'+'值的任何細菌名稱應出現在id.frame標籤中。 )被選中。 因此,標籤應該改爲:'Acetobacter aceti,Pseudomonas sp。'
此外,單擊self.meta_option.get()應該對應於第2列,縮小選擇範圍:'fac厭氧菌'值將標記爲'Acetobacter aceti','aerobe'值將標記'Pseudomonas sp。'。

data = array([ 
     ['Acetobacter aceti','+', 'fac anaerobe', '+', '--'], 
     ['Citrobacter freundii','--', 'fac anaerobe', '+', '--'], 
     ['Pseudomonas sp','+', 'aerobe', '--', '--']]) 

    data.readlines() 



def idbuttonclick(self, event): 

    self.id_frame.destroy() 
    self.id_frame = Frame(self.main_right_frame, borderwidth=5, height=50, background="white") 
    self.id_frame.pack(side=TOP, fill=BOTH) 

    if data[i,1]==self.gram_option.get(): 
     id = data [i,0] 
     Label(self.id_frame, text = id, background = "white").pack(side=LEFT, anchor = N) 

    if data[i,2]==self.shape_option.get(): 
     id = data [i,0] 
     Label(self.id_frame, text = id, background = "white").pack(side=LEFT, anchor = N) 

    if data[i,3]==self.meta_option.get(): 
     id = data [i,0] 
     Label(self.id_frame, text = id, background = "white").pack(side=LEFT, anchor = N) 

    if data[i,4]==self.cat_option.get(): 
     id = data [i,0] 
     Label(self.id_frame, text = id, background = "white").pack(side=LEFT, anchor = N) 

    else: Label(self.id_frame, text = 'Error: Not enough data', background = "white").pack(side=LEFT, anchor = N) 

如果我沒有說明我的座標數組正確或其他人知道我已經得到了關於這個問題的56次歷時約兩個可行的方式來安排在Python代碼上面的場景... 周,但沒有來自社區的代碼寫作反饋。希望這個新版本能夠更好地解決我原先想到的問題和需要調整的內容。

此致

傑夫

+0

你有沒有考慮過Enthought Traits?它隨Python(x,y)一起提供,使得設計簡單的GUI變得更容易。 –

+0

你的問題不是很清楚。當你說你有問題「讓單選按鈕和陣列相互作用」你是什麼意思?什麼樣的問題?什麼樣的互動?具體而言,你想發生什麼事情沒有發生? –

+0

@Bill - 您已複製我之前的修改。 :) 滾回來。 – razlebe

回答

0

該解決方案使用的概率比較,而不是+和 - (即,每個細菌具有越來越得到一個的+評分和1-X概率的X概率 - 得分。 )但是這段代碼將把數據按鈕連接到數據矩陣,然後相應地排列前十名評分細菌。所有的作品都在合作。

def idbuttonclick(self, event): 

    self.id_frame.destroy() 
    self.id_frame = Frame(self.main_right_frame, borderwidth=5, height=50, background="white") 
    self.id_frame.pack(side=TOP, fill=BOTH) 


    if (self.gram_option.get()=="+" and 
    self.meta_option.get()=="aerobe"): 
     Label(self.id_frame, text = "Gram Positive Aerobe", background = "white").pack(side=TOP, anchor = N) 


     bac=[('Aeromonas',0.95,0.05), 
     ('Bacillus',0.05, 0.95), 
     ('Hafnia',0.51, 0.51)] 



    else: Label(self.id_frame, text = "Error: Not enough data", background = "white").pack(side=TOP, anchor = N) 

    def plus(matrix, i): 
     return [row[i] for row in matrix] 

    def minus(matrix, i): 
     return [1.00-row[i] for row in matrix] 

    def average(lst): 
     return sum(lst)/len(lst) 

    bact=zip(*bac) 
    bact2=bact[0:1] 
    bact3=bact[0:1] 

    if self.cat_option.get()=="+": 
     bact2.append(plus(bac,1)) 
     bact3.append(plus(bac,1)) 
    if self.cat_option.get()=="--": 
     bact2.append(minus(bac,1)) 
     bact3.append(plus(bac,1)) 

    if self.oxi_option.get()=="+": 
     bact2.append(plus(bac,2)) 
     bact3.append(plus(bac,2)) 

    if self.oxi_option.get()=="--": 
     bact2.append(minus(bac,2)) 
     bact3.append(plus(bac,2)) 

    bac2=zip(*bact2) 
    bac3=zip(*bact3) 

    #experimental additive probability 
    #bac4 = [(bac2[0],reduce(mul,bac2[1:])) for bac2 in bac2] 

    #experimental mean probability 
    bac4 = [(bac2[0], average(bac2[1:])) for bac2 in bac2] 


    #experimental additive probability/expected outcome additive probability 
    #bac4 = [(bac2[0],reduce(mul,bac2[1:])/reduce(mul,bac3[1:])) for (bac2,bac3) in zip(bac2,bac3)] 

    bac5 = tuple(sorted(bac4, key=lambda item: item[1], reverse=True)) 


    Label(self.id_frame, text = bac5[0], background = "white").pack(side=TOP, anchor = W) 
    Label(self.id_frame, text = bac5[1], background = "white").pack(side=TOP, anchor = W) 
    Label(self.id_frame, text = bac5[2], background = "white").pack(side=TOP, anchor = W) 
    Label(self.id_frame, text = bac5[3], background = "white").pack(side=TOP, anchor = W) 
    Label(self.id_frame, text = bac5[4], background = "white").pack(side=TOP, anchor = W) 
    Label(self.id_frame, text = bac5[5], background = "white").pack(side=TOP, anchor = W) 
    Label(self.id_frame, text = bac5[6], background = "white").pack(side=TOP, anchor = W) 
    Label(self.id_frame, text = bac5[7], background = "white").pack(side=TOP, anchor = W) 
    Label(self.id_frame, text = bac5[8], background = "white").pack(side=TOP, anchor = W) 
    Label(self.id_frame, text = bac5[9], background = "white").pack(side=TOP, anchor = W) 
    Label(self.id_frame, text = bac5[10], background = "white").pack(side=TOP, anchor = W) 
相關問題