2012-02-24 12 views
0

私は、動物の間で選択するタプルに影響を与えるためにスケールウィジェットデータ(水生または地上)を使用するpython 2.7 tkinterモジュールを作成しました。モジュールは、3つの動物(シカ、ウナギ、カメ)を「Submit」をクリックして関連付けられたコマンドをアクティブにして降順でソートして表示します。そして鹿(ディア:0.00)を除去すべきである0.01に地上スケールスライディング:ウナギ(0.00うなぎ)を除去すべきである0.01に水生規模摺動理論的に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を超える限り、カメはゼロになるべきではありません。追加的な確率は働かない。両方が考慮されるように

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

は、どのように私はこれを表現しますが、どちらも相殺することができますか?

+1

このコードを質問の必須事項にしてください。 – Marcin

+0

これは蒸留されています。これはほんの少しの例です - root.titleに気づいてください - これを尋ねるために特別に作成しました。 100行は本当にスクロールするほどです - その大部分はスケールウィジェットに関する質問のウィジェット記述ですか?ラムダ:self.soil.get()* self.water.get()は、適切なコンテキストなしで非常に役立っていますか? – Jeff

答えて

1

確率は面白いものです。これらの確率を組み合わせるには、ではなく地上であり、それはではなく水生である可能性を見る必要があります。次に、その結​​合確率から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

補遺。 15以上の行を持つ大きなタプルに対してlambdaを繰り返し使用すると、メモリが不足してしまい、モジュールが実行を拒否します。土地と水= lambda:1-(1-self.soil.get())*(1-self.water.get())のようなローカル変数にリンクし、変数tylandandをタプルに入れると、メモリの問題が修正されます – Jeff