【问题标题】:Deleting/destroying button on python 3.4 that was made in for loop在for循环中制作的python 3.4上的删除/销毁按钮
【发布时间】:2014-12-27 01:31:50
【问题描述】:

我正在尝试销毁我单击的在 for 循环中创建的按钮。尝试使按钮进入列表,然后使用列表删除,但我似乎无法使其工作。

代码如下:

root = Tk()

word_list = ["APPLE", "PEAR", "BANANA"]

word = word_list [random.randint(0,2)]

abc = '_ ' * len(word)
print (word)
lives = 0

guessed_letters = []

buttons = []

#Function
def click_1 (key):
    buttons.append(key)
    print (buttons)
    if key in word:
        guessed_letters.append(key)
        abc = ''.join([key if key in guessed_letters else "_ " for key in word])
        if abc == word:
            letters_label.config(text="You win!")
            raise SystemExit
        letters_label.config(text=abc)
        key_1 = buttons.index(key)
        buttons[key_1].destroy(END)
    else:
        guessed_letters.append(key)
        global lives
        lives += 1
        hangman_label.config(text=hangman_pics[lives])
        if lives == 6:
            letters_label.config(text="You lose...")
            lives -= 1
            raise SystemExit





#Frames
hangman_frame = Frame(root)
hangman_frame.grid(row=0, column=0, sticky=N)
letter_frame = Frame(root)
letter_frame.grid(row=1, column=0, sticky=S)

#Label
letters_label = Label(hangman_frame, text=abc)
letters_label.grid(row=0, column=0, sticky=W)

hangman_label = Label(hangman_frame, text=hangman_pics[lives])
hangman_label.grid(row=1, column=0, sticky=W)



#Buttons
r = c = 0
for letter in string.ascii_uppercase:
    Button(letter_frame, text=letter, command=functools.partial(click_1, letter)).grid(row=r, column=c, sticky=W)
    c += 1
    if c > 12:
        c = 0
        r += 1

(抱歉阻塞,认为一切都是相关的)

谁能看出有什么不对?我尝试了很多不同的东西,但都不起作用。这段代码的具体错误信息是:

['A']
Exception in Tkinter callback
Traceback (most recent call last):
  File "/Library/Frameworks/Python.framework/Versions/3.3/lib/python3.3/tkinter/__init__.py", line 1475, in __call__
    return self.func(*args)
  File "/Users/alexeacott/Desktop/Hangman.py", line 85, in click_1
    buttons[key_1].destroy(END)
AttributeError: 'str' object has no attribute 'destroy'

如果我改变 。破坏() 到 .grid.forget 错误说:

AttributeError: 'str object has no attribute 'grid' 

我怎样才能不让它成为'str'?如何让我的代码正常工作?!

提前致谢。

编辑

根据建议:

#Buttons
r = c = 0
for letter in string.ascii_uppercase:
    c += 1
    my_button = Button(letter_frame, text=letter).grid(row=r, column=c, sticky=W)
    my_button.configure(command=functools.partial(click_1, letter, my_button)
    if c > 12:
        c = 0
        r += 1

这表示该行的冒号上有语法错误:

if c > 12:

【问题讨论】:

  • my_button.configure(...(...) 需要关闭 )。因此在下一行检测到 SyntaxError。在下一行检测丢失更接近是典型的。

标签: python for-loop tkinter widget python-3.3


【解决方案1】:

在您创建按钮的语句中:

Button(letter_frame, text=letter, command=functools.partial(click_1, letter)).grid(row=r, column=c, sticky=W)

您将letter 作为参数传递给click_1(key)letterstr。这就是问题所在。

您要做的是,将按钮本身作为另一个参数传递给它。您只能在创建按钮后执行此操作,如下所示:

my_button = Button(letter_frame, text=letter)
my_button.configure(command=functools.partial(click_1, letter, my_button))
my_button.grid(row=r, column=c, sticky=W)

并修改click_1 方法以将按钮作为其参数之一,如下所示:

#Function
def click_1 (key, button):
    buttons.append(button)
    # ...

更新:

您可能需要修改您的click_1 方法以使用key 获取按钮。要完成这项工作,您可以做的一个简单更改是将buttons 作为OrderedDict 而不是列表。 OrderedDict 只是一个 dict ,它会像 list 一样记住其项目的顺序。所以你修改的方法看起来像:

from collections import OrderedDict()
buttons = OrderedDict()        

#Function
def click_1 (key, button):
    buttons[key] = button
    print (buttons)
    if key in word:
        guessed_letters.append(key)
        abc = ''.join([key if key in guessed_letters else "_ " for key in word])
        if abc == word:
            letters_label.config(text="You win!")
            raise SystemExit
        letters_label.config(text=abc)
        #key_1 = buttons.index(key) # REMOVE this
        #buttons[key_1].destroy(END) # REMOVE this
        #Do this instead:
        buttons[key].destroy(END)
    else:
        guessed_letters.append(key)
        global lives
        lives += 1
        hangman_label.config(text=hangman_pics[lives])
        if lives == 6:
            letters_label.config(text="You lose...")
            lives -= 1
            raise SystemExit

希望有用。

【讨论】:

  • 按照您的建议进行操作会引发很多语法错误。检查我的编辑,看看我是否做得对。谢谢
  • 我在制作按钮时仍然遇到语法错误。我已经在我的编辑中描述了。谢谢
  • 你在该行的末尾错过了一个大括号'(':my_button.configure(command=functools.partial(click_1, letter, my_button)。应该是my_button.configure(command=functools.partial(click_1, letter, my_button))
  • 在我解决了这个问题后,我又进了一点!然而这个: AttributeError: 'NoneType' object has no attribute 'configure' 出现了,在我的 gui 上,只出现了 A 按钮。感谢到目前为止的所有帮助 - 已经学到了很多东西!
  • 对,我的错。我已经用该块中的更正更新了我的答案。我们将grid()method 的结果分配给my_button。我在回答中解决了这个问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-10
  • 1970-01-01
  • 2012-11-26
  • 2022-10-20
  • 2022-07-21
相关资源
最近更新 更多