如何将radiobutton选择与数组数据联系起来

时间:2011-09-14 00:32:27

标签: python arrays radio-button tkinter

我正在尝试使用tkinter python 2.7编写一个GUI可搜索细菌数据库,其中数据库数组嵌入代码中。通过无线电按钮选择某些标准有选择地搜索阵列,然后点击“识别”按钮应该打印出与这些选择相匹配的所有细菌的id作为标签。

我已在下面发布了非功能性代码段[idbuttonclick(self)]。

snippet def idbuttonclick(self)应该做什么:

1)搜索名为'data'的矩阵/数组,其中1-4列表示radiobutton字符串变量选项,每行表示细菌id

2)选择'data'中的行,其变量选项与radiobutton选择匹配

3)如果id的数量为1-20,则将所选行中数据列0中的细菌ID打印为self.id_frame中的标签。否则,打印消息标签“错误:数据不足。”

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)

我已经获得了基于radiobutton选择的id.frame标签的代码,但仍然无法将radiobutton选择链接到数组中的坐标,然后根据radiobutton / array坐标匹配提供id.frame标签。

它现在特别是一个数组,而不是一个矩阵,因为矩阵和列表和元组列表显然无法使用坐标索引(i,j)存储元素。

下面是我的新草稿,其中包括数组和idbutton click命令。

这应该如何运作: 如果选择了radiobutton self.gram_option =('+'),则数组列1中的任何细菌名称在同一行中的数组列2中具有'+'值应该出现在id.frame标签中。 因此,标签应为:'Acetobacter aceti,Pseudomonas sp。' 另外,单击self.meta_option.get()应该对应于第2列,缩小选择:'fac anaerobe'值将标记'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)

如果我没有正确地说明我的数组坐标,或者有人知道在python代码中安排上述场景的可行方法...... 在大约两周的时间里,我对这个问题得到了56个观点,但没有来自社区的代码撰写反馈。希望这个新版本更好地解决了我最初的想法以及需要调整的内容。

此致

杰夫

1 个答案:

答案 0 :(得分: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)