2015-08-16 119 views
1

我想用一个for循环创建按钮,并输入(状态=禁用)部件。要创建的小部件的数量将是运行时参数。我想要的是,每次点击按钮时,相应的条目都会启用(state =“normal”)。在我的代码中的问题是,我点击的任何按钮,它只影响最后一个条目小部件。有没有什么办法解决这一问题。?这里是我的代码:在你的代码如何链接在for循环中创建的python tkinter小部件?

from tkinter import * 

class practice: 
    def __init__(self,root): 
     for w in range(5): 
      button=Button(root,text="submit", 
       command=lambda:self.enabling(entry1)) 
      button.grid(row=w,column=0) 
      entry1=Entry(root, state="disabled") 
      entry1.grid(row=w,column=1) 

    def enabling(self,entryy): 
     entryy.config(state="normal") 

root = Tk() 
a = practice(root) 
root.mainloop() 

回答

1

几个问题 -

  1. 你应该让你创建的buttons和条目,并将它们保存在一个实例变量,最有可能这将是很好的将它们存储在列表中,那么w将是列表中每个按钮/条目的索引。

  2. 当你lambda: something(some_param) - 的some_param()函数值不是取代,直到当函数实际上是所谓的,在那个时候,它正在为entry1最新值,因此这个问题。您不应该依赖于此,而应该使用functools.partial()并发送Button/Entry索引来启用。

示例 -

from tkinter import * 
import functools 

class practice: 
    def __init__(self,root): 
     self.button_list = [] 
     self.entry_list = [] 
     for w in range(5): 
      button = Button(root,text="submit",command=functools.partial(self.enabling, idx=w)) 
      button.grid(row=w,column=0) 
      self.button_list.append(button) 
      entry1=Entry(root, state="disabled") 
      entry1.grid(row=w,column=1) 
      self.entry_list.append(entry1) 

    def enabling(self,idx): 
      self.entry_list[idx].config(state="normal") 


root = Tk() 
a = practice(root) 

root.mainloop() 
+0

哇。这解决了我的问题!谢谢! – Crstn

+0

@Crstn请注意,我说的第一点(在我的回答中)很重要。否则,你最终会陷入神秘的错误。 –

0

每当人们有问题,用lambda表达式,而不是DEF语句,我建议重写与DEF语句代码,直到它的工作原理正确创建的函数。以下是对代码的最简单修复:重新对窗口小部件创建进行排序,并将每个条目绑定到一个新函数作为默认参数。

from tkinter import * 

class practice: 
    def __init__(self,root): 
     for w in range(5): 
      entry=Entry(root, state="disabled") 
      button=Button(root,text="submit", 
       command=lambda e=entry:self.enabling(e)) 
      button.grid(row=w,column=0) 
      entry.grid(row=w,column=1) 

    def enabling(self,entry): 
     entry.config(state="normal") 

root = Tk() 
a = practice(root) 
root.mainloop() 
+0

它也可以工作!谢谢! – Crstn