【发布时间】:2012-02-22 17:11:36
【问题描述】:
我正在尝试创建一个 python 2.7 tkinter 模块,该模块使用比例小部件数据来影响列表理解,该列表理解在概率特征表示为列表列表的动物之间进行选择。单击“提交”并激活相关命令后,该模块按降序排列和显示这三种动物。
在此示例中,所有三只动物在点击“提交”后的比例均为 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()
感谢许多贡献的改进,此代码有效!
【问题讨论】:
-
查看我的更新,了解适当的(如果有点尴尬)方法。
-
你解释得很好,我已经更新了代码,看起来应该可以工作,但是元组规模的交互仍然让我很适应。我尝试将比例条目声明为 DoubleVar() 变量,但没有运气。只要代码能正常运行而又不会过于冗长,谁会在意尴尬?
-
您没有调用该函数。您不能只将函数或方法与数字相乘。这就是我在帖子底部说“你必须进一步分解列表理解以明确调用
l[2]”时的意思。您必须先调用它。类似reduce(mul, [item[2]()] + item[3:])。 -
哎呀。没听懂。谢谢。我会一直玩它直到我让它工作,然后更新方程。
-
永远不要使用
import *,并且尤其是不要使用多个import *。
标签: python tkinter list-comprehension tkinter-scale