0

我有以下代码(仅部分代码)用于获取我创建的 4 个条目框中的条目。但是我有两个小问题:

  • 当我在每个框中输入时,它会输入相同的内容,我希望输入不同的数字并将它们全部分配给单独的变量。

  • 有没有办法在一个循环中产生 4 个盒子并且比这更少的行?

    number = StringVar() def numberwritten(*args): number.trace("w", numberwritten) fg = number.get() print fg

    在单独的定义中 def ChoiceBox(choice): (不是这个 def 下的完整代码)

    def 选择框(选择):i = [0, 1, 2, 3]

        for i in i:
            choice_title = Label(choice_frame, text='Value %g'% float(i+1), bg='white', borderwidth=0, width=0)
            choice_title.grid(row=0, column=column+i, sticky="nsew", padx=1, pady=1)
    
        box1 = Entry(choice_frame, bg='white', borderwidth=0, width=0, textvariable=number)
        box1.grid(row=1, column=0, sticky="ew", padx=1, pady=1)
        box2 = Entry(choice_frame, bg='white', borderwidth=0, width=0, textvariable=number)
        box2.grid(row=1, column=1, sticky="ew", padx=1, pady=1)
        box3 = Entry(choice_frame, bg='white', borderwidth=0, width=0, textvariable=number)
        box3.grid(row=1, column=2, sticky="ew", padx=1, pady=1)
        box4 = Entry(choice_frame, bg='white', borderwidth=0, width=0, textvariable=number)
        box4.grid(row=1, column=3, sticky="ew", padx=1, pady=1)
    

更新/编辑:

这是我拥有的代码部分,由于我收到语法错误,因此无法弄清楚它最后出了什么问题:

def numberwritten(number):
    fg = number.get()
    print fg

numbers = [StringVar() for i in xrange(4) ] #Name available in global scope. 
for i in numbers: 
    i.trace('w',lambda n=i: numberwritten(n) ) 


def ChoiceBox(choice):


    column = 0
    if choice == "Fixed":
        choice_frame.grid_forget()      
    tkMessageBox.showinfo("Message", "No optimisation, value fixed.")
    elif choice == "List":

        for i in xrange(4): 
            choice_title = Label(choice_frame, text='Value %g'% float(i+1), bg='white', borderwidth=0, width=0) 
        choice_title.grid(row=0, column=column+i, sticky="nsew", padx=1, pady=1) 
        boxes=[] 

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


    elif choice == "Interval" or "Optimisation":
        i = [0, 1]
        choice_title1 = Label(choice_frame, text='Min Value', bg='white', borderwidth=0, width=0)
        choice_title1.grid(row=0, column=column, sticky="N S E W", padx=1, pady=1)
        choice_title2 = Label(choice_frame, text='Max Value', bg='white', borderwidth=0, width=0)
        choice_title2.grid(row=0, column=column+1, sticky="nsew", padx=1, pady=1)

        boxes=[]

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

for i in xrange(4): 
        box=Entry(choice_frame,bg='white',borderwidth=0,textvariable=numbers[i]) 
        box.grid(row=1,column=i, sticky='ew', padx=1, pady=1 
        boxes.append(box)
    box1,box2,box3,box4=boxes
4

2 回答 2

1

StringVarEntry(以及 Tkinter 中的其他一些东西)的模型。您已经为每个Entry实例提供了对同一StringVar对象的引用,因此它们自然而然地共享模型并因此显示相同的内容。您需要制作四个不同的StringVar对象,每个对象一个Entry。(那些,您将在一个循环中创建一个遍历StringVars 集合的循环……)

于 2012-06-26T14:46:55.187 回答
0

首先,请停止使用:

i=[1,2,3,4]
for i in i:
    ...

采用:

for i in (1,2,3,4):
    ...

反而。

或更好:

for i in xrange(1,5): #range in python3.x
    ...

现在,在循环中创建东西很容易:

strvars=[]
boxes=[]
for i in xrange(1,5):
    svar=StringVar()
    box=Entry(choice_frame, bg='white', borderwidth=0, width=0, textvariable=svar)
    box.grid(row=1, column=i-1, sticky="ew", padx=1, pady=1)
    svar.trace('w',numberwritten)
    #If you want to pass the box associated with the stringvar, you can do this:
    #svar.trace('w',lambda a,b,c,box=box : numberwritten(box)) #box.get() get's the contents of an Entry too!
    strvars.append(svar)
    boxes.append(box)

number1,number2,number3,number4=strvars  #unpack stringvars 
box1,box2,box3,box4=boxes   #unpack boxes

StringVar每个盒子都需要一个不同的。仅当您知道包含 StringVars 和 Entry 框的列表中有多少项目时,拆包才有效。否则,您可以获得对您想要的框/变量的引用,boxes[0]例如strvars[0]

编辑

像这样的东西应该工作......

def numberwritten(number):
    fg = number.get()
    print fg 

numbers = [StringVar() for i in xrange(4) ]  #Name available in global scope.
for i in numbers:
    i.trace('w',lambda a,b,c,n=i: numberwritten(n) )

# In separate definition def ChoiceBox(choice): (not full code under this def)
def ChoiceBox(choice):  

    for i in xrange(4):
        choice_title = Label(choice_frame, text='Value %g'% float(i+1), bg='white', borderwidth=0, width=0)
        choice_title.grid(row=0, column=column+i, sticky="nsew", padx=1, pady=1)

    boxes=[]
    for i in xrange(4):
        box=Entry(choice_frame,bg='white',borderwidth=0,textvariable=numbers[i])
        box.grid(row=1,column=i, sticky='ew', padx=1, pady=1
        boxes.append(box)

    box1,box2,box3,box4=boxes

顺便说一句,你为什么width=0到处使用?没有宽度的条目/标签几乎没用。

于 2012-06-26T14:47:05.887 回答