如何将单选按钮选择与数组数据关联
我正在尝试用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 个回答
这个解决方案使用概率比较,而不是简单的加和减(也就是说,每种细菌有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)