0

我通过在导入文本文件后重复小部件在 Tkinter 中创建了一个表(因此根据包含的信息创建新行)。

下图显示我需要能够根据 OptionMenu 选项从“7”列开始创建一个单独的输入框区域。

桌子

对于选项列表,询问用户他们希望填写多少个输入框(因此创建了“n”个框)。对于“固定”值,不应该有任何框和删除之前的任何框。对于 OptionMenu 中的其他两个选项,始终有一个最小值和最大值(2 个框)。这些框中的每个值都需要在用户输入后收集。

我以前曾帮助我每次都创建一个新框架,但如果可能的话,我想使用同一个框架。我有以下代码可供选择:

if choice == "Fixed":

    for i in xrange(self.number_boxes):

        self.box[i].grid_remove()
        self.choice_title.grid_remove()
        self.frame_table.grid_columnconfigure(7, weight=0)
    tkMessageBox.showinfo("Message", "Value fixed.")
elif choice == "List":
    self.win2 = tk.Toplevel(self.root)
    self.win2.title("List")
    self.list_text = Label(self.win2, text="Please enter number of values to be used:")
    self.list_text.grid(row=0, column=0, sticky="nsew", padx=1, pady=1)
    self.value = StringVar()
    self.list_values = Entry(self.win2, textvariable=self.value, justify="center")
    self.list_values.grid(row=1, column=1, sticky="nsew", padx=1, pady=1)

    list_button = ttk.Button(self.win2, text="Enter", command=self.ValueBox)
    list_button.grid(row=2, column=1, sticky="nsew", padx=1, pady=1)
    self.win2.mainloop()

    column = 7
    self.number_boxes = int(self.number_boxes)
    self.numbers = [StringVar() for i in xrange(self.number_boxes) ]  
    self.box = []

    for i in xrange(self.number_boxes):
        self.clicked.append(False)
        self.choice_title = Label(self.frame_table, bg=self.mycolour, borderwidth=0, width=10) 
        self.choice_title.grid(row=1, column=self.column, columnspan=self.number_boxes, sticky="nsew", padx=1, pady=1) 
        self.box.append(Entry(self.frame_table,bg='white',borderwidth=0, width=10, justify="center", textvariable=self.numbers[i], fg='grey'))
        self.box[i].grid(row=self.row_list,column=self.column+i, sticky='nsew', padx=1, pady=1) 
        self.box[i].insert(0, "Value %g" % float(i+1))
        self.box[i].bind("<Button-1>", lambda event : self.callback(event))

        self.total_boxes = self.number_boxes * ( rows - 2 )
        self.boxes=[]
        self.boxes.append(self.box[i])

        tkMessageBox.showinfo("Message", "Please fill in list values.")

    for i in self.numbers: 
        i.trace('w',lambda : self.numberwritten() ) 

    elif choice == "Min" or "Max":

        self.numbers = [StringVar() for i in xrange(2) ] #Name available in global scope. 
        self.number_boxes = 2
        self.box = []
        for i in xrange(2): 
            self.clicked.append(False)
            self.choice_title = Label(self.frame_table, bg=self.mycolour, borderwidth=0)
            self.choice_title.grid(row=1, column=self.column, columnspan=2, sticky="nsew", padx=1, pady=1)
            self.box.append(Entry(self.frame_table,bg='white',borderwidth=0,textvariable=self.numbers[i], justify='center', fg='grey'))
            self.box[i].grid(row=self.row_list, column=self.column+i, sticky='nsew', padx=1, pady=1) 
        if i == 0:
            self.box[0].insert(0, "Min value")
        elif i == 1:
            self.box[1].insert(0, "Max value")
            self.box[i].bind("<Button-1>", lambda event : self.callback(event))
            self.boxes=[]
            self.boxes.append(self.box[i])

        tkMessageBox.showinfo("Message", "Enter Min/Max values.")

        for i in self.numbers: 
            i.trace('w',lambda a,b,n=i: self.numberwritten(n) ) 

更新部分

def numberwritten(self): # where the above code block is usually all indented differently in comparision to this.
    self.numbers.get()

def callback(self, event, index):

    if (self.clicked[index] == False):
        self.box[index].delete(0, END)
        self.box[index].config(fg='black')
        self.clicked[index] = True

我不想用代码轰炸这个问题,但是如果需要任何其他功能,例如 numberwritten,我可以提供它们。我将非常感谢一些帮助,因为我快要结束了,但我正在为“最后的润色”而苦苦挣扎。

4

1 回答 1

0

在下面的循环中有一些可疑的地方(我会在可疑的地方添加评论)。

for i in xrange(self.number_boxes):
    self.clicked.append(False)
    self.choice_title = Label(self.frame_table, bg=self.mycolour, borderwidth=0, width=10)  #Fishy
    self.choice_title.grid(row=1, column=self.column, columnspan=self.number_boxes, sticky="nsew", padx=1, pady=1) 
    self.box.append(Entry(self.frame_table,bg='white',borderwidth=0, width=10, justify="center", textvariable=self.numbers[i], fg='grey'))
    self.box[i].grid(row=self.row_list,column=self.column+i, sticky='nsew', padx=1, pady=1) 
    self.box[i].insert(0, "Value %g" % float(i+1))
    self.box[i].bind("<Button-1>", lambda event, index=i : self.callback(event, index))

    self.total_boxes = self.number_boxes * ( rows - 2 ) #fishy
    self.boxes=[] #fishy
    self.boxes.append(self.box[i])

    tkMessageBox.showinfo("Message", "Please fill in list values.") #fishy

首先,您正在创建choice_title标签,但您只保留对您正在创建的其中一个标签的引用。也许您应该将其更改为列表并像使用框列表一样附加到它。

其次,self.total_boxes不需要每次循环计算。它可以在最后计算(我认为)。

三、self.boxes=[]应移到循环前。你所做的相当于: self.boxes=[self.box[i]]在循环的每一步。完成后,您的盒子列表中只有一个盒子(最后一个)。

第四,在循环的每次迭代中都用一个消息框提示用户。这真的是你想要的吗?还是缩进错误?

这里可能还有更多有点奇怪的东西,但这些给了你一个开始的地方。这是我认为它应该看起来的样子:

self.box=[]
self.boxes=[]
self.choice_title=[]
for i in xrange(self.number_boxes):
    self.clicked.append(False)
    choice_title = Label(self.frame_table, bg=self.mycolour, borderwidth=0, width=10)  #Fishy
    choice_title.grid(row=1, column=self.column, columnspan=self.number_boxes, sticky="nsew", padx=1, pady=1)
    self.choice_title.append(choice_title)
    box=Entry(self.frame_table,bg='white',borderwidth=0, width=10, justify="center", textvariable=self.numbers[i], fg='grey')
    self.box.append(box)
    box.grid(row=self.row_list,column=self.column+i, sticky='nsew', padx=1, pady=1) 
    box.insert(0, "Value %g" % float(i+1))
    box.bind("<Button-1>", lambda event, index=i : self.callback(event, index))

    self.boxes.append(box)  #This is still a little weird since self.box and self.boxes are essentially the same information.

self.total_boxes = self.number_boxes * ( rows - 2 ) #fishy
tkMessageBox.showinfo("Message", "Please fill in list values.") 
于 2012-07-10T13:06:52.993 回答