0

首先为代码的长度道歉,但我想展示这一切。

我有一个看起来像这样的界面:

表界面

当我将第三个选项菜单更改为“列表”时,我将添加具有“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(self,choice),我有以下部分,我需要更改注释行以接受“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

然而,我仍然遇到使用 numberwritten 的问题,包括原始示例中的前几行代码来完全提取值列表,最好是针对每一行。

4

1 回答 1

1

虽然我不相信您已经找到了表达界面的最简单方法,但做您想做的事情相对简单。

从概念上讲,要添加用于编辑值的条目,您必须定义(并存储对)作为该值模型的对象。然后,您定义将操纵该值的小部件(或小部件)。然后根据需要添加这样的键绑定(通常没有;默认值非常好)。最后,将小部件添加到整个用户界面(grid例如,通过方法)。但是,这确实意味着您必须设计整体代码来处理大小不固定的模型。(当然,删除条目是相反的过程。)

开始将代码重构为更小的部分来完成整个任务的较小部分是一个好主意。例如,编写一个函数来创建一个模型,一个入口小部件,将该小部件添加到 GUI,并返回模型对象。其他任何需要创建这样一个耦合条目的地方都可以要求这个专家功能为他们完成这项工作,这样你就可以一次做对了。通过将事情分解成具有明确定义的任务的小块,可以更容易地专注于更复杂的逻辑方面,而不是陷入小部件管理的(冗长、无聊的)细节中。

于 2012-06-29T13:44:09.527 回答