【问题标题】:How to tie radiobutton selections with array data如何将单选按钮选择与数组数据联系起来
【发布时间】:2011-11-16 14:59:57
【问题描述】:

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

我在下面发布了非功能性的 sn-p [idbuttonclick(self)]。

sn-p def idbuttonclick(self) 应该做什么:

1) 搜索名为“data”的矩阵/数组,其中第 1-4 列代表一个单选按钮字符串变量选项,每行代表一个细菌 id

2) 选择“数据”中变量选项与单选按钮选择匹配的行

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)

我已经获得了代码,可以根据单选按钮选择为我提供 id.frame 标签,但仍然无法将单选按钮选择链接到数组中的坐标,然后根据单选按钮/数组坐标匹配提供 id.frame 标签.

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

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

这应该如何工作: 如果选择了单选按钮 self.gram_option=('+'),则数组第 1 列中的任何细菌名称在同一行内的数组第 2 列中具有“+”值应出现在 id.frame 标签中。 因此,标签应为:“醋酸醋杆菌,假单胞菌。”
此外,单击 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 次意见,但没有来自社区的代码编写反馈。希望这个新版本能更好地解决我最初的想法和需要调整的地方。

此致,

杰夫

【问题讨论】:

  • 你考虑过Enthought Traits吗?它随 Python(x,y) 一起提供,让设计简单的 GUI 变得更加容易。
  • 你的问题不是很清楚。当您说您在“让单选按钮和数组交互”时遇到问题时,您是什么意思?什么样的问题?什么样的互动?具体来说,您希望发生哪些没有发生的事情?
  • @Bill - 你复制了我之前的编辑。 :) 回滚。
  • @razlebe:哎呀!我们有一个工具,我们可以单击以自动将答案转换为编辑。通常人们不会标记编辑,所以我们只是使用该工具而不检查编辑是否已经发生。无论如何,感谢您修复它。 :)
  • 你的问题还是很模糊。就好像您要求我们为您编写代码一样。具体有什么不明白的?您是否无法从单选按钮 StringVars 中获取值?您不知道如何进行实际的搜索或打印吗?也许您可以将这些问题分别放在单独的问题中。

标签: python arrays radio-button tkinter


【解决方案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)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-06-23
    • 1970-01-01
    • 1970-01-01
    • 2019-02-10
    • 2018-09-24
    • 2021-11-10
    • 2021-01-26
    • 2015-01-18
    相关资源
    最近更新 更多