如何将单选按钮选择与数组数据关联

-1 投票
1 回答
822 浏览
提问于 2025-04-17 02:15

我正在尝试用Python 2.7的tkinter库写一个可以搜索细菌的图形界面数据库,数据库的内容直接嵌入在代码里。用户可以通过单选按钮选择一些条件,然后点击“识别”按钮,程序应该会把所有符合这些条件的细菌的ID打印出来,显示在一个标签上。

下面是我发布的一个不太能用的代码片段[idbuttonclick(self)]。

这个代码片段def idbuttonclick(self)应该完成的工作是:

1) 在名为'data'的数组中搜索,数组的第1到第4列代表单选按钮的选项,每一行代表一个细菌的ID。

2) 选择'data'中那些选项与单选按钮选择相匹配的行。

3) 如果选中的细菌ID数量在1到20之间,就把这些ID从'data'的第0列打印到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)

我已经让代码根据单选按钮的选择生成了id.frame的标签,但仍然无法将单选按钮的选择与数组中的坐标关联起来,从而根据单选按钮和数组坐标的匹配来提供id.frame的标签。

现在它具体是一个数组,而不是矩阵,因为矩阵、列表和元组似乎不能通过坐标索引(i,j)来存储元素。

下面是我的新草稿,包括数组和idbutton点击命令。

这个功能应该是这样的:

在数组的第1列中,任何细菌名称如果在同一行的第2列有一个'+'值,那么当单选按钮self.gram_option被选为'+'时,这个细菌名称就应该出现在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

这个解决方案使用概率比较,而不是简单的加和减(也就是说,每种细菌有X的概率得到一个+分数,还有1-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)

撰写回答