Как удалить кнопку, когда она была нажата, если кнопки были сделаны циклом for? - PullRequest
0 голосов
/ 09 мая 2019

Я хочу добавить функцию, которая уничтожает кнопку (и все более высокие / более низкие) при ее нажатии, если она не является целевой кнопкой.

Надеюсь, это немного прояснит.

import tkinter as tk
from tkinter import ttk
import random

window = tk.Tk()
window.title('The Game')
window.geometry('1000x850')
target = random.randint(1,10)
words = []
for j in range(1, 11):
    unit = "box" + str(j)
    words.append(unit)
a=0
lives = 3
for i in words:
    a = a + 1
    def btn_press(event):
        guess = event.widget['text']
        global lives
        lives -= 1
        lives_rem.config(text = 'Lives remaining: ' + str(lives))
        if guess == target:
            print('you win')
            window.destroy()
        elif lives == 0:
            print('you lose')
            window.destroy()
        elif guess > target:
            #in this case, the button pressed and all of the higher ones should be destroyed
            print('too high')
        elif guess < target:
            #in this case, the button pressed and all of the lower ones should be destroyed
            print('too low')
    i = tk.Button(window, text = a)
    i.config(height = '3', width = '6')
    i.bind('<Button-1>', btn_press)
    i.place(x = -50 + a * 70, y = 25)

lives_rem = tk.Label(window, text = "Lives remaining: " + str(lives), fg = 'red')
lives_rem.place(x = 800, y = 50)
window.mainloop()

Ответы [ 2 ]

1 голос
/ 09 мая 2019

Вы изменили свой вопрос с тех пор, как я впервые прокомментировал, так что теперь вам нужно отслеживать все созданные Button, потому что теперь вы хотите "уничтожить" больше, чем просто нажатие.В приведенном ниже коде они хранятся в новой глобальной переменной list с именем buttons.

Один виджет, отображаемый с помощью диспетчера геометрии place(), может исчезнуть с помощью place_forget()метод.Объединение этого с новым списком buttons позволяет также влиять на видимость других в функции обратного вызова события '<Button-1>'.

Ниже приведен ваш код с изменениями, показывающими, как это сделать.Обратите внимание, что я также оптимизировал несколько других вещей, а также сделал так, чтобы в целом он следовал рекомендациям PEP 8 - Руководство по стилю для кода Python чуть более точно.

import tkinter as tk
import random

window = tk.Tk()
window.title('The Game')
window.geometry('1000x850')

target = random.randint(1,10)
print('target:', target)
words = ["box" + str(j) for j in range(1, 11)]
a = 0
lives = 3

buttons = []  # Remember all Buttons.
for _ in words:
    a += 1

    def btn_press(event):
        global lives

        guess = event.widget['text']
        lives -= 1
        lives_rem.config(text='Lives remaining: ' + str(lives))
        if guess == target:
            print('you win')
            window.destroy()
        elif lives == 0:
            print('you lose')
            window.destroy()
        elif guess > target:
            # In this case, the button pressed and all of the higher ones
            # should be destroyed.
            event.widget.place_forget()
            print('too high')
            for btn in buttons:
                if btn['text'] > guess:
                    btn.place_forget()
        elif guess < target:
            # In this case, the button pressed and all of the lower ones should
            # be destroyed.
            event.widget.place_forget()  # Added MRM
            print('too low')
            for btn in buttons:
                if btn['text'] < guess:
                    btn.place_forget()


    btn = tk.Button(window, text=a)
    btn.config(height=3, width=6)
    btn.bind('<Button-1>', btn_press)
    btn.place(x=a*70 - 50, y=25)
    buttons.append(btn)

lives_rem = tk.Label(window, text="Lives remaining: " + str(lives), fg='red')
lives_rem.place(x=800, y=50)
window.mainloop()
0 голосов
/ 09 мая 2019

Я добавил несколько строк в ваш код, чтобы заставить Button уничтожить, если это не целевое значение.

  1. Я не понимаю, почему у вас есть функция btn_press() внутри блока for.Он создал как 10 btn_press() функций.Полагаю, у каждой кнопки есть своя функция, но поверьте мне, одного достаточно.Поэтому я поместил функцию вне цикла for

  2. Я добавил event.widget.destroy() в два условия (для высокого и для низкого), так что тогда она не является целью Buttonон получает destroy().

  3. Кроме того, ваш подход не очень хорош, вы можете значительно улучшить свой код.

Вот ваш обновленныйкод.

from tkinter import ttk
import tkinter as tk
import random

window = tk.Tk()
window.title('The Game')
window.geometry('1000x850')
target = random.randint(1,10)

words = []
for j in range(1, 11):
    unit = "box" + str(j)
    words.append(unit)

a=0
lives = 3


def btn_press(event):
        guess = event.widget['text']
        global lives
        lives -= 1
        lives_rem.config(text = 'Lives remaining: ' + str(lives))
        if guess == target:
            print('you win')
            Score['text'] = 'Score: You Win' 
            window.destroy()
        elif lives == 0:
            print('you lose')
            Score['text'] = 'Score: You Lose' 
            window.destroy()
        elif guess > target:
            #in this case, the button pressed and all of the higher ones should be destroyed
            Score['text'] = 'Score: Too High' 
            print('too high')
            event.widget.destroy()
        elif guess < target:
            #in this case, the button pressed and all of the lower ones should be destroyed
            Score['text'] = 'Score: Too Low' 
            print('too low')
            event.widget.destroy()

for i in words:
    a = a + 1
    i = tk.Button(window, text = a)
    i.config(height = '3', width = '6')
    i.bind('<Button-1>', btn_press)
    i.place(x = -50 + a * 70, y = 25)

lives_rem = tk.Label(window, text = "Lives remaining: " + str(lives), fg = 'red')
lives_rem.place(x = 800, y = 50)

Score = tk.Label(window, text = "Score: " )
Score.place(x = 400, y = 100 )

window.mainloop()
...