2012-02-24 4 views
0

Я создал модуль pton 2.7 tkinter, который использует данные масштабного виджета (водные или земные), чтобы влиять на кортеж, который выбирает между животными. Модуль сортирует и отображает трех животных (оленей, угрей, черепах) в ранжированном порядке по убыванию при нажатии «Отправить» и активации соответствующей команды.Вероятность добавления python

from Tkinter import (N, S, E, W, BOTH, BOTTOM, END, FLAT, HORIZONTAL, LEFT, NO, RAISED, RIGHT, TOP, YES, Button, Entry, Frame, Grid, Label, Pack, Scale, Text, Tk) 

from operator import mul 

root = Tk() 
root.title('Example') 

class Environment: 
    def __init__(self, parent): 

     # layout 
     self.myParent = parent 

     self.main_frame = Frame(parent, background="light blue") 
     self.main_frame.pack(expand=YES, fill=BOTH) 

     self.main_left_frame = Frame(self.main_frame, background="light blue") 
     self.main_left_frame.pack(side=LEFT, expand=YES, fill=BOTH) 

     self.main_right_frame = Frame(self.main_frame, background="light blue") 
     self.main_right_frame.pack(side=RIGHT, expand=YES, fill=BOTH) 

     self.water = Scale(self.main_right_frame, from_=0.01, to=1.00, orient=HORIZONTAL, bd=0, label="Aquatic", 
     background="white", troughcolor="cyan", length=50, width=10, sliderlength=10, resolution=0.01) 
     self.water.pack() 
     self.water.set(1.00) 

     self.soil = Scale(self.main_right_frame, from_=0.01, to=1.00, orient=HORIZONTAL, bd=0, label="Terrestrial", 
     background="white", troughcolor="saddle brown", length=50, width=10, sliderlength=10, resolution=0.01) 
     self.soil.pack() 
     self.soil.set(1.00) 

     self.id_frame = Frame(self.main_left_frame, background="white") 
     self.id_frame.pack(side=BOTTOM) 

     # submit button 
     self.submitbutton = Button(self.main_left_frame,text="Submit", background="black", foreground="white", 
     width=6, padx="2m", pady="1m") 
     self.submitbutton.pack(side=TOP) 
     self.submitbutton.bind("<Button-1>", self.submitbuttonclick) 
     self.submitbutton.bind("<Return>", self.submitbuttonclick) 

     #Animal Matrix 
     self.animal = [ 
     ('Odocoileous virginiana','White-tailed Deer',self.soil.get,0.99,0.01,0.99), 
     ('Anguilla anguilla','American Eel',self.water.get,0.99,0.01,0.99), 
     ('Trachemys scripta','Red-eared Slider',lambda:self.soil.get()*self.water.get(),0.99,0.01,0.99)] 

    def submitbuttonclick(self, event): 
     self.id_frame.destroy() 
     self.id_frame = Frame(self.main_left_frame, background="white") 
     self.id_frame.pack(side=BOTTOM) 

     A=self.animal 

     #equation 
     sigma = float(sum(reduce(mul,item[3:]) for item in A)) 
     B = [(item[0], "%.2f" % (item[2]()*reduce(mul, item[3:])/sigma)) for item in A] 
     C = sorted(B, key=lambda item: item[1], reverse=True) 

     Label(self.id_frame, text = C[0], background = "white").pack(side=TOP, anchor = W) 
     Label(self.id_frame, text = C[1], background = "white").pack(side=TOP, anchor = W) 
     Label(self.id_frame, text = C[2], background = "white").pack(side=TOP, anchor = W) 

environment = Environment(root)  
root.mainloop() 

В теории скольжения водной шкалы 0,01 следует исключить угорь (Угорь: 0,00) и сдвинув земную шкалу 0.01 следует исключить олень (Deer: 0,00). Это прекрасно работает.

Однако, имея дело с животным, которое является как водным, так и наземным, код разваливается. Черепаха не должна достигать нуля, если водная или земная шкала выше 0,01. Аддитивная вероятность не работает.

lambda:self.soil.get()*self.water.get() 

Как я могу выразить это так, чтобы оба рассматривались, но не могут отменить другой?

+1

Пожалуйста, перепродадите этот код до необходимого вам предмета. – Marcin

+0

Это дистиллировано. Это минимальный пример - обратите внимание на root.title, специально созданный для того, чтобы задать этот вопрос и несколько связанных вопросов, касающихся вопросов настройки, которые у меня были с гораздо большим модулем. На самом деле 100 строк действительно так сильно прокручиваются - большинство из них - описания виджетов в вопросе о виджетах масштаба? Обеспечивало бы lambda: self.soil.get() * self.water.get() было очень полезно без надлежащего контекста? – Jeff

ответ

1

Вероятности - забавные вещи. Чтобы комбинировать эти вероятности, вам необходимо взглянуть на вероятность того, что это не terrestial, и это не aquatic. Затем возьмите 1 минус, что комбинированная вероятность. Код для черепахи будет выглядеть так.

('Trachemys scripta','Red-eared Slider',lambda:1-(1-self.soil.get())*(1-self.water.get()),0.99,0.01,0.99)] 
+0

Спасибо, ты спасатель жизни. Я собираюсь похлопать себя по лбу, чтобы не рассказать о себе. – Jeff

+0

Ваш прием. Рад помочь. –

+0

Addendum. Если вы используете лямбду снова и снова для большого кортежа с 15 + строками, вы быстро исчерпаете память, и модуль откажется работать. Связывая его с локальной переменной, такой как waterandwater = lambda: 1- (1-self.soil.get()) * (1-self.water.get()) и помещая переменную почву и воду в ваш кортеж, фиксирует проблему с памятью – Jeff

Смежные вопросы