Я вижу несколько проблем с вашим кодом.
1-й, если вы используете place
для своего кадра.
Это может вызвать проблемы при добавлении новых кнопок, поскольку это не позволит корректно изменить размер окна с новым макетом.
2-й - это то, как вы пишете свой код. Вы называете свой фрейм root
и используете метод quit
для фрейма, а не для своего корневого окна. То, как вы пишете вещи, усложняет процесс следования, поэтому при написании кода учитывайте рекомендации PEP8.
3-й, вы пытаетесь применить mainloop
к вашему фрейму в функции dump
. Вам нужен только 1 экземпляр mainloop, и это относится к реальному корневому окну (Tk()
).
Чтобы ответить на ваш вопрос о том, как изменить цвет метки позже, я бы использовал список для хранения ваших кнопок и меток. Таким образом, мы можем ссылаться на их значения индекса и применять ваш произвольный цветовой код к меткам при нажатии кнопки.
Я переписал большую часть вашего кода в соответствии с PEP8 и провел общую очистку.
Дайте мне знать, если у вас есть какие-либо вопросы.
import tkinter as tk
import random
def color(ndex):
button_label_list[ndex][1].config(bg="#%06x" % random.randint(0, 16777215))
def dump():
global count, button_label_list
button_label_list.append([tk.Button(frame, text="color", command=lambda x=count: color(x)),
tk.Label(frame, text="Color", bg="#" + ("%06x" % random.randint(0, 16777215)))])
button_label_list[-1][0].grid(row=0, column=count, sticky='nsew')
button_label_list[-1][1].grid(row=1, column=count, sticky='nsew')
frame.columnconfigure(count, weight=1)
count += 1
root = tk.Tk()
count = 0
button_label_list = []
root.title("Hello")
root.rowconfigure(1, weight=1)
root.columnconfigure(2, weight=1)
frame = tk.Frame(root)
frame.rowconfigure(1, weight=1)
frame.grid(row=0, column=2, sticky='nsew', rowspan=2)
tk.Button(root, text="butt ON", command=dump).grid(row=0, column=0, sticky='nsew')
tk.Button(root, text="Quit!", command=root.quit).grid(row=0, column=1, sticky='nsew')
tk.Label(root, text="This is a label", bg="PeachPuff").grid(row=1, column=1, columnspan=1, sticky='nsew')
root.mainloop()
Результаты:
Окно, в которое можно добавлять новые кнопки и изменять цвет на каждой этикетке. Основные 2 кнопки, с которых начинается окно, являются статическими в том смысле, что их нельзя вытолкнуть из окна, как в примере с вашим кодом, и они останутся на месте с привязкой слева.
![enter image description here](https://i.stack.imgur.com/K2vX1.png)