Как связать выбор радиокнопок с массивом данных - PullRequest
0 голосов
/ 14 сентября 2011

Я пытаюсь написать базу данных бактерий с возможностью поиска в графическом интерфейсе с массивом базы данных, встроенным в код с использованием tkinter python 2.7.При выборе определенных критериев с помощью радиокнопок выборочный поиск в массиве, а затем нажатие кнопки «Идентифицировать» должно распечатать идентификатор всех бактерий, которые соответствуют этим выборкам в качестве метки.

Я разместил нефункциональный фрагмент [idbuttonclick (self)] ниже.

Что должен делать фрагмент кода idbuttonclick (self):

1) Поискматрица / массив с именем «data», для которых столбцы 1–4 представляют параметр переменной строки радиокнопки, а в каждой строке идентификатор бактерии

2) Выберите строки в «data», чьи параметры переменных соответствуют выбранным значениям радиокнопки

3) Печатает идентификаторы бактерий в столбце данных 0 из выбранных строк в качестве метки в self.id_frame, если число идентификаторов равно 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).

Вот мой новый черновик ниже, который включает в себя команду click для массива и idbutton.

Как это должно работать: Любое имя бактерии в столбце массива 1 со значением «+» в столбце массива 2 в той же строке должно появиться в метке id.frame, есликнопка радио self.gram_option = ('+') выбрана.Таким образом, на этикетке должно быть написано: «Acetobacter aceti, Pseudomonas sp.»
Кроме того, нажатие self.meta_option.get () должно соответствовать столбцу 2, сужая выбор: значение «fac anaerobe» будет обозначать «Acetobacter aceti»и значение «аэроб» будет обозначать «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 голосов
/ 05 октября 2011

Это решение использует сравнение вероятностей вместо + и - (т. Е. Каждая бактерия имеет 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...