【问题标题】:Sneaky way of disabling a button once it's been pressed?按下按钮后偷偷摸摸地禁用按钮?
【发布时间】:2013-12-01 01:19:51
【问题描述】:

这是关键,按钮没有名字!

代码:

  Button(buttonFrame, height=2, width=5, text = alpha[i], command=lambda j=i:
  self.letterGuess(alpha[j])).grid(row=1, column=self.columnz(i))

我在 Tkinter 类中创建了一个循环,它创建了 26 个字母按钮。现在,当按下按钮时,会执行一个回调函数(letterGuess),并且命令行会打印出“Button %s% letter”。

但我也想在按下按钮时禁用它。怎样才能做到这一点?

编辑: 这是循环:

    alpha = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z']
    buttonFrame = Frame(self).grid(row=0, column=1)
    for i in range(len(alpha)):

        if i <= 6:
             Button(buttonFrame, height=2, width=5, text = alpha[i], command=lambda j=i: self.letterGuess(alpha[j])).grid(row=1, column=self.columnz(i))
        elif i > 6 and i <=13:
            Button(buttonFrame, height=2, width=5, text = alpha[i], command=lambda j=i: self.letterGuess(alpha[j])).grid(row=2, column=self.columnz(i))
        elif i > 13 and i <=20:
            Button(buttonFrame, height=2, width=5, text = alpha[i], command=lambda j=i: self.letterGuess(alpha[j])).grid(row=3, column=self.columnz(i))
        elif i > 20 and i <26:
            Button(buttonFrame, height=2, width=5, text = alpha[i], command=lambda j=i: self.letterGuess(alpha[j])).grid(row=4, column=self.columnz(i))

【问题讨论】:

  • 循环显示你如何创建按钮。
  • 检查按钮属性 state 并从那里开始。

标签: python button lambda tkinter


【解决方案1】:

您需要按钮引用 - 所以您需要将 Button 分配给变量

temp = Button(...)
temp.config(command=lambda j=i, button=temp: self.letterGuess(alpha[j], button))
temp.grid(...)

现在您可以在letterGuess 中引用此按钮,您可以使用它来禁用按钮

def letterGuess(letter, button):
    button.config(state=DISABLED)

但如果您稍后需要更改按钮状态,您可以将参考保存在列表或字典中

# before loop
all_buttons = dict()

# inside loop
all_buttons[ alpha[i] ] = Button(...)
all_buttons[ alpha[i] ].grid(...) 

# in function
def letterGuess(letter):
    all_buttons[ letter ].config(state=DISABLED)

编辑:

alpha = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z']
buttonFrame = Frame(self).grid(row=0, column=1)

all_buttons = dict()

for i in range(len(alpha)):

    if i <= 6:
         all_buttons[ alpha[i] ] = Button(buttonFrame, height=2, width=5, text = alpha[i], command=lambda j=i: self.letterGuess(alpha[j]))
         all_buttons[ alpha[i] ].grid(row=1, column=self.columnz(i))
    elif 6 < i <=13:
         all_buttons[ alpha[i] ] = Button(buttonFrame, height=2, width=5, text = alpha[i], command=lambda j=i: self.letterGuess(alpha[j]))
         all_buttons[ alpha[i] ].grid(row=2, column=self.columnz(i))
    elif 13 < i <=20:
         all_buttons[ alpha[i] ] = Button(buttonFrame, height=2, width=5, text = alpha[i], command=lambda j=i: self.letterGuess(alpha[j]))
         all_buttons[ alpha[i] ].grid(row=3, column=self.columnz(i))
    elif 20 < i <26:
         all_buttons[ alpha[i] ] = Button(buttonFrame, height=2, width=5, text = alpha[i], command=lambda j=i: self.letterGuess(alpha[j]))
         all_buttons[ alpha[i] ].grid(row=4, column=self.columnz(i))

顺便说一句:

您可以使用6 &lt; i &lt;=13 代替i &gt; 6 and i &lt;= 13

你可以使用

for i, letter in enumerate(alpha):

然后您可以使用letter 代替alpha[i]

【讨论】:

  • 我想将按钮分配给变量,但是我必须创建 26 个按钮变量,对吗?有没有办法为此使用循环?
  • 您可以使用列表或字典来保留对按钮的引用。您可以像在回答中那样循环执行。
  • 不错。我会暂时尝试一下。感谢您的帮助!
  • 我在你的循环中添加示例。
猜你喜欢
  • 2012-10-22
  • 1970-01-01
  • 1970-01-01
  • 2011-08-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-29
相关资源
最近更新 更多