Используя код в этом ответе: Получите список верхних уровней на Tkinter:
'''
List all objects in play next song
https://stackoverflow.com/questions/60978666/get-list-of-toplevels-on-tkinter
'''
LAST_TIME=0.0
THING_COUNT=0
def toplevels(ventana):
global LAST_TIME, THING_COUNT
now = time.time()
if not int(now) == int(LAST_TIME):
if THING_COUNT > 0:
print('Number of things:', THING_COUNT)
THING_COUNT = 0
print('\n============= toplevels() called at:', t(now),'=============')
LAST_TIME = now
for k, v in ventana.children.items():
if isinstance(v, tk.Toplevel):
print('Toplevel:', k, v)
else:
print(' other:', k, v)
toplevels(v)
THING_COUNT += 1
Я называю это так:
toplevels(root)
Вывод таков:
Number of things: 42
============= toplevels() called at: Dec 24 2020 12:03:27 =============
Toplevel: 140109521792176 .140109521792176
other: 140109520829184 .140109521792176.140109520829184
other: 140109520830264 .140109521792176.140109520829184.140109520830264
other: 140109520859360 .140109521792176.140109520829184.140109520859360
other: 140109520829472 .140109521792176.140109520829184.140109520829472
other: 140109521432304 .140109521792176.140109521432304
other: 140109520827600 .140109521792176.140109521432304.140109520827600
other: 140109520828032 .140109521792176.140109521432304.140109520827600.140109520828032
other: 140109520827888 .140109521792176.140109521432304.140109520827600.140109520827888
other: 140109520828896 .140109521792176.140109521432304.140109520827600.140109520828896
other: 140109520828176 .140109521792176.140109521432304.140109520827600.140109520828176
other: 140109520828608 .140109521792176.140109521432304.140109520827600.140109520828608
other: 140109520828392 .140109521792176.140109521432304.140109520827600.140109520828392
other: 140109520767024 .140109521792176.140109521432304.140109520767024
other: 140109520827384 .140109521792176.140109521432304.140109520767024.140109520827384
other: 140109520767096 .140109521792176.140109521432304.140109520767024.140109520767096
other: 140109520827096 .140109521792176.140109521432304.140109520767024.140109520827096
Toplevel: 140109520827168 .140109520827168
other: 140109521621360 .140109520827168.140109521621360
other: 140109521623016 .140109520827168.140109521621360.140109521623016
other: 140109521621576 .140109520827168.140109521621360.140109521621576
other: 140109521623160 .140109520827168.140109521621360.140109521623160
other: 140109521623376 .140109520827168.140109521621360.140109521623376
other: 140109521622152 .140109520827168.140109521621360.140109521622152
other: 140109521622728 .140109520827168.140109521621360.140109521622728
other: 140109521623232 .140109520827168.140109521621360.140109521623232
other: 140109521621936 .140109520827168.140109521621360.140109521621936
other: 140109521622800 .140109520827168.140109521621360.140109521622800
other: 140109521622944 .140109520827168.140109521621360.140109521622944
other: 140109521623448 .140109520827168.140109521621360.140109521623448
other: 140109521623520 .140109520827168.140109521623520
other: 140109521624888 .140109520827168.140109521623520.140109521624888
other: 140109521624024 .140109520827168.140109521623520.140109521624024
other: 140109521623664 .140109520827168.140109521623520.140109521623664
other: 140109396840528 .140109520827168.140109521623520.140109396840528
other: 140109521624456 .140109520827168.140109521623520.140109521624456
other: 140109521624240 .140109520827168.140109521623520.140109521624240
other: 140109521624672 .140109520827168.140109521623520.140109521624672
other: 140109396840744 .140109520827168.140109521623520.140109396840744
other: 140109396840960 .140109520827168.140109396840960
other: 140109396841176 .140109520827168.140109396840960.140109396841176
other: 140109396841392 .140109520827168.140109396840960.140109396841392
Он правильно показывает два верхних уровня. Во-первых, это дерево музыкальной библиотеки. Во-вторых, в данный момент воспроизводится песня с четырьмя кадрами:
Как я могу преобразовать ссылки на машинный язык:
other: 140109521624240 .140109520827168.140109521623520.140109521624240
В удобочитаемый формат, например:
Мне нужно создать функцию, которая будет представлять информацию в удобочитаемом формате и разрешать изменять цвета, размеры шрифта (мониторы hdpi), темы и т. д. Эти изменения затем применяются с другой функцией, которая использует методы .configure(). Я также планирую использовать словарь и хранить его в файле конфигурации pickle для последующего повторного применения.
@Novel Когда вы говорите «просто сохранить», это подразумевает изменение print(v) на print(save(v)), но я не думаю, что вы имели в виду это.
Ну, я не знаю, что вы хотите делать с объектами, поэтому под «сохранить» я имею в виду делать все, что вы хотите. Например, если вы хотите распечатать ширину, вы должны print(v.winfo_width()).
@ Роман Это работает как шарм! Теперь мне нужно выяснить, как перебрать все атрибуты объекта, которые есть у объекта winfo_width(). Затем я должен начать выбирать атрибуты для печати с предложениями if.
@Novel Благодаря вашей помощи я опубликовал ответ, который дал желаемый конечный результат. Ответ с промежуточными шагами (перечисление всех атрибутов и т. д.) будет намного длиннее, поскольку диагностический вывод состоит из тысяч строк.






Чтобы решить проблему с настройкой. В этом приложении есть рамка с 8 кнопками tkinter, у которых нет названий. Каждые несколько минут цвет фона для обложки меняется, и его необходимо распространить на все кнопки.
Вот функция для этого:
def config_all_buttons(level, **kwargs):
''' Configure all tk buttons within a frame (doesn't work for toplevel?).
level = frame name, eg self.play_btn
**kwargs = tkinter_button.configure(keywords and values). For example:
fg = "#000000", bg = "#ffffff", padx=5
'''
for k, v in level.children.items():
if isinstance(v, tk.Button):
if v["image"] == "":
# We can't configure image labels that have a value
v.configure(**kwargs)
config_all_buttons(v, **kwargs)
Вот как вы вызываете функцию из вашей основной ветки или класса:
self.play_frm_bg = self.play_resized_art.getpixel((3,3))
hex_background = img.rgb_to_hex(self.play_frm_bg)
self.play_frm_fg = img.contrasting_rgb_color(self.play_frm_bg)
hex_foreground = img.rgb_to_hex(self.play_frm_fg)
self.play_frm.configure(bg=hex_background)
toolkit.config_all_labels(self.play_frm, fg=hex_foreground, \
bg=hex_background)
toolkit.config_all_buttons(self.play_btn, fg=hex_foreground, \
bg=hex_background)
Вот как это выглядит, когда рисунок имеет фон цвета «темный шоколад»:
Вот как это выглядит, когда рисунок имеет «темно-оранжевый» фон:
Вот как это выглядит, когда изображение имеет «желтый» цвет фона, из-за чего текст становится черным:
Когда вы используете
print(v), вы конвертируете фактический объект в ссылочную строку. Просто сохраните объектv.