2011-09-14 45 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) 
相关问题