Tkinter получает имена, атрибуты и значения объекта по номеру ссылки

Используя код в этом ответе: Получите список верхних уровней на 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

В удобочитаемый формат, например:

  • Это окно шириной x, высотой y, смонтировано в координатах x,y рабочего стола, name="self.play_top"
  • Это кадр на nsew, с заводным рельефом, name="playfrm"
  • Это ярлык со шрифтом по умолчанию, размером 12 пунктов, содержащий «этот текст», text variable="self.current_song_name"
  • Это кнопка, text="✘ Close", padx=2, pady=2, foreground="#0000000", background="#ffffff", внутреннее имя="бла-бла"

Мне нужно создать функцию, которая будет представлять информацию в удобочитаемом формате и разрешать изменять цвета, размеры шрифта (мониторы hdpi), темы и т. д. Эти изменения затем применяются с другой функцией, которая использует методы .configure(). Я также планирую использовать словарь и хранить его в файле конфигурации pickle для последующего повторного применения.

Когда вы используете print(v), вы конвертируете фактический объект в ссылочную строку. Просто сохраните объект v.

Novel 24.12.2020 20:29

@Novel Когда вы говорите «просто сохранить», это подразумевает изменение print(v) на print(save(v)), но я не думаю, что вы имели в виду это.

WinEunuuchs2Unix 24.12.2020 20:31

Ну, я не знаю, что вы хотите делать с объектами, поэтому под «сохранить» я имею в виду делать все, что вы хотите. Например, если вы хотите распечатать ширину, вы должны print(v.winfo_width()).

Novel 24.12.2020 20:44

@ Роман Это работает как шарм! Теперь мне нужно выяснить, как перебрать все атрибуты объекта, которые есть у объекта winfo_width(). Затем я должен начать выбирать атрибуты для печати с предложениями if.

WinEunuuchs2Unix 24.12.2020 21:07

@Novel Благодаря вашей помощи я опубликовал ответ, который дал желаемый конечный результат. Ответ с промежуточными шагами (перечисление всех атрибутов и т. д.) будет намного длиннее, поскольку диагностический вывод состоит из тысяч строк.

WinEunuuchs2Unix 27.12.2020 01:34
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
5
439
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Чтобы решить проблему с настройкой. В этом приложении есть рамка с 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)

Вот как это выглядит, когда рисунок имеет фон цвета «темный шоколад»:

Вот как это выглядит, когда рисунок имеет «темно-оранжевый» фон:

Вот как это выглядит, когда изображение имеет «желтый» цвет фона, из-за чего текст становится черным:

Другие вопросы по теме