質問

Scale widgetデータを使用して、確率特性がリストのリストとして表される動物の間で選択するリストの理解に影響を与えるpython2.7tkinterモジュールを作成しようとこのモジュールは、「送信」をクリックして関連するコマンドをアクティブにすると、3匹の動物を降順に並べ替えて表示します。

この例では、3匹の動物はすべて同じ確率データを共有しているため、「送信」をクリックした後、33%になります。動物は、リストの2列目のスケールウィジェットデータ間でのみ異なり、それぞれが水生、陸生、またはその両方であるという点で異なる。

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

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','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()

多くの貢献の改善のおかげで、このコードは動作します!

役に立ちましたか?

解決

最初にその通知を定義する A する空の辞書を上書きる空の辞書と self.animal, である。

    A={}
    A=self.animal

でお使いいただくことによって利用することをいいます。そのおの定義 B まスライスす:

    B = [(A[0], "%.2f" % (reduce(mul,A[3:])*A[2][i]/sigma*A[2][i])) for A in A]

これは当てはまりませんスクエアと のいずれか の定義 A, なーゆさんこちらで用意したスライス、dictものindexまたは 3, で、最大のインデックス self.animal2.混乱!しかし、細かいことが明らかになっ問題であるだけ再利用 A として指数付けをに変更します。す 本当に ないこと;このコード 非常に 混乱している。

で引き起こすこともあります。のコードを参照してください:

>>> a = range(10)
>>> [a for a in a]
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> a
9

ご覧のとおり、リスト内包原因 a の終値の配列として従来知られている a.そのようなことはなコードで使用発電機を表現。しかし、まだハードの読みや混乱している。I 強く お勧めいこう:

    sigma = float(sum(reduce(mul,item[3:]) for item in A))
    B = [(item[0], "%.2f" % (reduce(mul,item[3:])/sigma)) for item in A] 

更新:OK、あった方に対して、これらの変更は、いまだに get からのデータ。おの定義 self.animal, 使 self.soil.get(), のような:

('Odocoileous virginiana','White-tailed Deer',self.soil.get(),0.99,0.01,0.99)

これは戻り値の self.soil.get() にタプル.その値は固定でいます。おいて明示的に呼び出 self.soil.get() 毎回 したい更新された値です。また、リストの理解なもアクセスに返される値である。まスライスしてこのように:

>>> l = ('Odocoileous virginiana','White-tailed Deer',
...      self.soil.get(), 0.99, 0.01, 0.99)
>>> l[3:]
(0.98999999999999999, 0.01, 0.98999999999999999)

覚えている割りにはリストやタプル開始 0 --では、上記のタプル l, l[0] == 'Odocoileous virginiana'.だいたいものがないということでスライスからのインデックス2:

>>> l[2:]
(0.55000000000000004, 0.98999999999999999, 0.01, 0.98999999999999999)

それではない解決の根本問題であるとき電話 self.soil.get() の取得を更新します。片ができるようになるだけで再現 self.animal 毎回、提出ボタンがヒット。この無駄なものです。少ない無駄なものだくアプローチするに保存する機能のタプルの代わりに、結果の機能です。んでいるように:

>>> l = ('Odocoileous virginiana','White-tailed Deer',
...      self.soil.get, 0.99, 0.01, 0.99)

注前 ()self.soil.get.現在のタプルを含まない浮動小数点値かを返す関数浮動小数点の値とします。お電話での値を取得するかを返します完全に値が更新されます。統合機能を使用でき lambda:

>>> l = ('Odocoileous virginiana','White-tailed Deer',
...      lambda: self.soil.get() * self.water.get(), 0.99, 0.01, 0.99)

今話ができ l[2] 得値:

>>> l[2]()
0.30250000000000005

それでは、なくてはならない、休憩のときに理解が少し明示的に呼び出 l[2], が、お客さま人数小児-幼児のときは、こすべきます。これは理想的な設定をもって休暇を改善建築としての運動のリーダー.

他のヒント

A[2][i]/sigma*A[2][i] このビットは浮動小数点数のインデックスを作成しようとしています。これはすべきですか: A[i]/sigma*A[i] 代わりに?

私はaの値がすべて浮動小数点数であると仮定しました。

ザ- for A in A 一部は私には少し危険なようです。構文的には正しいかもしれませんが、コレクションとそれらのコレクション内の要素に異なる名前を使用する方が一般的に明確です。

また、 for isolates in A: i = A.index(isolates) を使用することにより、はるかに効果的にすることができます for i, isolates in enumerate(A), 、として A.index(isolates) Aが大きいときに長い時間がかかることがあります。

私はあなたの質問に対する答えではないことを知っていますが、それにもかかわらず役に立つことを願っています。

デバッグを容易にするために(そして実際にあなたを助けるために)、これを書き直してください:

[(A[0], "%.2f" % (reduce(mul,A[3:])*A[2][i]/sigma*A[2][i])) for A in A]

もう少し読みやすいものに。複数の行で何かに分割すると、実際にデバッガを使用して、どの変数が'float'であり、どこで索引付けされているかを簡単に確認できます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top