首先为代码长度道歉,但我想展示一切。
我有一个如下所示的界面:
当我将第三个选项菜单更改为“列表”时,我将添加选项以包含'n'值(未显示)。然后我需要'n'列,用户可以输入它们的值。
我还有一个问题,根据接口打开的文本文件,可能有'n'行。
因此,我想知道是否有可能(因为我难以在框中重复相同的值而现在我需要'n'列)添加'n'个行和列,如我的代码所示,只需添加4列。我可以读取行的数量,但是根据有多少行而无法返回所有这些值。到目前为止,我可以做一行......
谢谢!
def numberwritten(number):
fg = number.get()
print fg
numbers = [StringVar() for i in xrange(4) ] #Name available in global scope. Need to add other rows?
for i in numbers:
i.trace('w',lambda a,b,c,n=i: numberwritten(n) )
def ChoiceBox(choice):
co_ord = str(frame_table.grid_size())
col, rows = map(float, co_ord.strip('()').split(','))
rows = int(rows)
if choice == "Fixed":
empty1.destroy()
#choice_frame.grid_forget()
tkMessageBox.showinfo("Message", "No optimisation, value fixed.")
elif choice == "List":
column = 7
for i in xrange(4):
choice_title = Label(frame_table, text='Value %g'% float(i+1), bg='white', borderwidth=0, width=10)
choice_title.grid(row=1, column=column+i, sticky="nsew", padx=1, pady=1)
boxes=[]
for i in xrange(4):
for j in range(2, rows):
box=Entry(frame_table,bg='white',borderwidth=0,textvariable=numbers[i], width=10, justify="center") # Here I'm having problems with rows
box.grid(row=j,column=column+i, sticky='nsew', padx=1, pady=1)
boxes.append(box)
box1,box2,box3,box4=boxes
elif choice == "Interval" or "Optimisation":
for i in xrange(2):
choice_title1 = Label(frame_table, text='Min Value', bg='white', borderwidth=0)
choice_title1.grid(row=0, column=column, sticky="nsew", padx=1, pady=1)
choice_title2 = Label(frame_table, text='Max Value', bg='white', borderwidth=0)
choice_title2.grid(row=0, column=column+1, sticky="nsew", padx=1, pady=1)
boxes=[]
for i in xrange(2):
box=Entry(frame_table,bg='white',borderwidth=0,textvariable=numbers[i])
box.grid(row=rows+1,column=i, sticky='ew', padx=1, pady=1)
boxes.append(box)
box1,box2,box3,box4=boxes
更新:我稍微提升了,现在在Window类下的ChoiceBox中的部分是ChoiceBox(自我,选择),我有以下部分我需要更改注释行以接受'n'数量盒子。
column = 7
for i in xrange(self.number_boxes):
choice_title = Label(self.frame_table, text='Value %g'% float(i+1), bg='white', borderwidth=0, width=10)
choice_title.grid(row=1, column=column+i, sticky="nsew", padx=1, pady=1)
boxes=[]
for i in xrange(self.number_boxes):
for j in range(2, rows):
box=Entry(self.frame_table,bg='white',borderwidth=0,textvariable=numbers[i], width=10, justify="center")
box.grid(row=j,column=column+i, sticky='nsew', padx=1, pady=1)
boxes.append(box)
#box1,box2,box3,box4=boxes
然而,我仍然遇到使用数字编写的问题,包括原始示例中的前几行代码,以完全提取值列表,最好是每行。
答案 0 :(得分:1)
虽然我不相信你已经找到了表达界面的最简单方法,但做你想做的事情相对简单。
从概念上讲,要添加一个用于编辑值的条目,您必须定义(并存储对该引用的引用)作为该值的模型的对象。然后,您可以定义将操纵该值的窗口小部件(或窗口小部件)。然后根据需要添加这样的键绑定(通常没有;默认值非常好)。最后,将小部件添加到整个用户界面(例如,通过grid
方法)。但是,这确实意味着您拥有来设计整体代码来处理大小不固定的模型。 (当然,删除条目是相反的过程。)
最好将重构您的代码放到较小的部分中,以完成整个任务的较小部分。例如,将函数写入只是创建模型,条目小部件,将该小部件添加到GUI,以及返回模型对象。其他需要创建这样一个耦合条目的地方可以要求这个专家函数为他们完成这项工作,这样你就可以一次。通过使用非常明确定义的任务将事物分解成更小的部分,更容易关注更复杂的逻辑方面,而不是陷入小部件管理的(冗长乏味)细节。