Tkinter не может изменить цвет объекта (кнопки) с помощью команды, что мне не хватает? - PullRequest
0 голосов
/ 04 мая 2019

Я пытаюсь сделать кнопки с циклом for запускает команду для изменения цвета этой кнопки.

Это работает, но изменяет только одну кнопку.

from tkinter import*
from tkinter.colorchooser import *
top=Tk()
buttonlist=[]
button_counter=0
def change_color():
    #change button color
    color=askcolor()
    color=color[1]
   buttonlist[0].configure(bg=color)

how_many_times=range(2)
y=25

for num in how_many_times:
   buttonlist.append(Button(width=5, 
  relief=SUNKEN, bg="Black", 
  command=change_color))
    buttonlist[button_counter].place(x=10, y=y)
    y=y+100
    button_counter=button_counter+1 
top.mainloop()

Это не работает. С одной стороны, это заставляет меня изменить цвет перед созданием кнопки. Также выдает ошибку.

from tkinter import*
from tkinter.colorchooser import *
top=Tk()
buttonlist=[]
button_counter=0

def change_color(button_number):
        #change button color
    color=askcolor()
    color=color[1]
    buttonlist[button_number].configure(bg=color)




how_many_times=range(2)
y=25
for num in how_many_times:
    buttonlist.append(Button(width=5, 
        relief=SUNKEN, bg="Black", command=change_color(button_counter)))
    buttonlist[button_counter].place(x=10, y=y)
    y=y+100
    button_counter=button_counter+1
top.mainloop()

Ошибка:

Traceback (most recent call last):
 File  "/data/user/0/ru.iiec.pydroid3/files/temp_iiec_codefile.py", line 19, in <module>
 buttonlist.append(Button(width=5, relief=SUNKEN, bg="Black", command=change_color(button_counter)))
 File "/data/user/0/ru.iiec.pydroid3/files/temp_iiec_codefile.py", line 11, in change_color
buttonlist[button_number].configure(bg=color)
IndexError: list index out of range

1 Ответ

0 голосов
/ 04 мая 2019

command= ожидайте callback - это означает, что имя функции без ()

Вы должны использовать лямбду, чтобы назначить функцию с параметрами. Но lambda внутри цикла for необходимо также n=num, чтобы использовать правильные значения в функции. без этого он будет использовать последнее значение из цикла for во всех кнопках. И это значение может быть больше, чем количество элементов в списке - и это может дать ошибку list index out of range

import tkinter as tk
import tkinter.colorchooser as tkcolorchooser

# --- functions ---

def change_color(button_number):
    #change button color
    color = tkcolorchooser.askcolor()
    color = color[1]
    buttonlist[button_number].configure(bg=color)

# --- main ---

buttonlist = []
y = 25

top = tk.Tk()

for num in range(2):
    b = tk.Button(width=5, relief="sunken", bg="Black",
               command=lambda n=num:change_color(n))
    b.place(x=10, y=y)
    buttonlist.append(b)
    y += 100

top.mainloop()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...