Как создать гиперссылки для каждой кнопки в списке? [Ткинтер]

Вчера я составил список кнопок, и я хотел немного его улучшить, добавив гиперссылку для каждого элемента в списке. Однако нажатие каждой кнопки вообще ничего не дает (на самом деле, я считаю, что в результате этого получилось «Нет»). Все ссылки на YouTube были объединены в массив, и для каждого элемента я попытался назначить гиперссылку.

Вот код для этого:

from tkinter import *
import webbrowser

root = Tk()
root.title('Scrollbar text box')
root.geometry("600x500")




#my exercise list

FullExerciseList = [
    "Abdominal Crunches", 
    "Russian Twist",
    "Mountain Climber",
    "Heel Touch" ,
    "Leg Raises",
    "Plank",
    "Cobra Stretch",
    "Arm Raises",
    "Side Arm Raises",
    "Tricep Dips",
    "Arm Circles Clockwise",
    "Arm Circles Counter Clockwise",
    "Diamond Push Ups",
    "Jumping Jacks" ,
    "Chest Press Pulse",
    "Push Ups" ,
    "Wall Push Ups",
    "Triceps Stretch Left" ,
    "Tricep Stretch Right",
    "Cross Arm Stretch" ,
    "Rhomboid Pulls",
    "Knee Push Ups",
    "Arm Scissors",
    "Cat Cow Pose",
    "Child Pose",
    "Incline Push Ups",
    "Wide Arm Push Ups",
    "Box Push Ups",
    "Hindu Push Ups",
    "Side Hop",
    "Squats",
    "Side Lying Lift Left",
    "Side Lying Lift Right",
    "Backward Lunge",
    "Donkey Kicks Right",
    "Donkey Kick Left",
    "Left Quad Stretch",
    "Right Quad Stretch",
    "Wall Calf Raises"
    ]





#def yview function

def multiple_yview(*args):
    my_text1.yview(*args)
    my_text1.yview(*args)
    



#frame

my_frame = Frame(root)
my_frame.pack(pady=20)



#scrollbar

text_scroll = Scrollbar(my_frame)
text_scroll.pack(side = RIGHT, fill = Y)

# changed yscrollcommand=text_scroll to yscrollcommand=text_scroll.set
my_text1 = Text(my_frame, width=20, height=25, font=("Helvetica", 16), yscrollcommand=text_scroll.set, wrap='none')
my_text1.pack(side=RIGHT, padx=5)

#configuring scroll bar

text_scroll.config(command = multiple_yview)




vid_links = [
    "https://www.youtube.com/watch?v=RUNrHkbP4Pc&list=PLoVy-85EFtK92qMfHTNZi0BAA3T1AbDys&index=9", 
    "https://www.youtube.com/watch?v=Lha66p0ZXUc&list=PLoVy-85EFtK92qMfHTNZi0BAA3T1AbDys&index=62",
    "https://www.youtube.com/watch?v=Lha66p0ZXUc&list=PLoVy-85EFtK92qMfHTNZi0BAA3T1AbDys&index=62",
    "https://www.youtube.com/watch?v=YslHgg2E-Ro&list=PLoVy-85EFtK92qMfHTNZi0BAA3T1AbDys&index=95",
    "https://www.youtube.com/watch?v=_LGpDtENZ5U&list=PLoVy-85EFtK92qMfHTNZi0BAA3T1AbDys&index=64",
    "https://www.youtube.com/watch?v=dcJVA2sBPqw&list=PLoVy-85EFtK92qMfHTNZi0BAA3T1AbDys&index=92",
    "https://www.youtube.com/watch?v=kqnua4rHVVA",
    "https://www.youtube.com/watch?v=Fz4oo1vFo9M&list=PLoVy-85EFtK92qMfHTNZi0BAA3T1AbDys&index=81",
    "https://www.youtube.com/watch?v=DMwRPGMPB10&list=PLoVy-85EFtK92qMfHTNZi0BAA3T1AbDys&index=75",
    "https://www.youtube.com/watch?v=z21McHHOpAg&list=PLoVy-85EFtK92qMfHTNZi0BAA3T1AbDys&index=11"
    "https://www.youtube.com/watch?v=ATusl0jg4SU",
    "https://www.youtube.com/watch?v=UCmqw3kKZ38&list=PLoVy-85EFtK92qMfHTNZi0BAA3T1AbDys&index=60"
    "https://www.youtube.com/watch?v=SJ1Xuz9D-ZQ",
    "https://www.youtube.com/watch?v=SJ1Xuz9D-ZQ",
    "https://www.youtube.com/watch?v=9bR-elyolBQ&list=PLoVy-85EFtK92qMfHTNZi0BAA3T1AbDys&index=3",
    "https://www.youtube.com/watch?v=HE0ijmUc6Og&list=PLoVy-85EFtK92qMfHTNZi0BAA3T1AbDys&index=51",
    "https://www.youtube.com/watch?v=3WUUeM07i_Q&list=PLoVy-85EFtK92qMfHTNZi0BAA3T1AbDys&index=42",
    "https://www.youtube.com/watch?v=2W4ZNSwoW_4&list=PLoVy-85EFtK92qMfHTNZi0BAA3T1AbDys&index=2",
    "https://www.youtube.com/watch?v=jWxvty2KROs&list=PLoVy-85EFtK92qMfHTNZi0BAA3T1AbDys&index=7",
    "https://www.youtube.com/watch?v=DxBDqHL5NlM",
    "https://www.youtube.com/watch?v=dGKbTKLnym4&list=PLoVy-85EFtK92qMfHTNZi0BAA3T1AbDys&index=29",
    "https://www.youtube.com/watch?v=wQq3ybaLZeA&list=PLoVy-85EFtK92qMfHTNZi0BAA3T1AbDys&index=4",
    "https://www.youtube.com/watch?v=Fcbw82ykBvY&list=PLoVy-85EFtK92qMfHTNZi0BAA3T1AbDys&index=15",
    "https://www.youtube.com/watch?v=R08gYyypGto&list=PLoVy-85EFtK92qMfHTNZi0BAA3T1AbDys&index=13",
    "https://www.youtube.com/watch?v=DEyDbzSudEU&list=PLoVy-85EFtK92qMfHTNZi0BAA3T1AbDys&index=93",
    "https://www.youtube.com/watch?v=DxBDqHL5NlM",
    "https://www.youtube.com/watch?v=DJQGX2J4IVw&list=PLoVy-85EFtK92qMfHTNZi0BAA3T1AbDys&index=10",
    "https://www.youtube.com/watch?v=YslHgg2E-Ro&list=PLoVy-85EFtK92qMfHTNZi0BAA3T1AbDys&index=95",
    "https://www.youtube.com/watch?v=nYmUEJIBj3c&list=PLoVy-85EFtK92qMfHTNZi0BAA3T1AbDys&index=66",
    "https://www.youtube.com/watch?v=jgh6sGwtTwk",
    "https://www.youtube.com/watch?v=jgh6sGwtTwk",
    "https://www.youtube.com/watch?v=42bFodPahBU&list=PLoVy-85EFtK92qMfHTNZi0BAA3T1AbDys&index=76",
    "https://www.youtube.com/watch?v=JhX1nBnirNw&list=PLoVy-85EFtK92qMfHTNZi0BAA3T1AbDys&index=19",
    "https://www.youtube.com/watch?v=SaZK9vlSmHI",
    "https://www.youtube.com/watch?v=SaZK9vlSmHI",
    "https://www.youtube.com/watch?v=GQa_N7wft7M",
    "https://www.youtube.com/watch?v=EOf3cGIQpA4&list=PLoVy-85EFtK92qMfHTNZi0BAA3T1AbDys&index=71",
    "https://www.youtube.com/watch?v=pQUsUHvyoI0&list=PLoVy-85EFtK92qMfHTNZi0BAA3T1AbDys&index=43",
    ]

for link in vid_links:
    
    def callback():
        a = 0
        for i in range(len(vid_links)):
            webbrowser.open_new('{}'+'"{}"'.format('r', link[a]))
            a+=1

for item in FullExerciseList:
    button = Button(my_text1, text=item, command = callback) 
    # inserting button into my_text1
    my_text1.window_create('end', window=button)
    # add a newline so that each button is in a separate line
    my_text1.insert('end', '\n')

Любая помощь приветствуется =)

1. Функция callback перезаписывается при каждой итерации цикла for. 2. Когда я выполнял ваш код, '{}'+'"{}"'.format('r', link[a]) всегда возвращал {}"r". Итак, я думаю, что в этой строке есть логическая ошибка.

Sriram Srinivasan 09.04.2022 12:09

как вы думаете, я должен поместить оба утверждения в одну и ту же функцию?

superbo9y 09.04.2022 13:03

Что вы собираетесь делать в этой строке: webbrowser.open_new('{}'+'"{}"'.format('r', link[a]))? Были ли у вас проблемы с webbrowser.open_new(link)?

Sriram Srinivasan 09.04.2022 13:07

Я хотел перебрать список, чтобы назначить ссылку каждой кнопке. Использование ` webbrowser.open_new(link) ` открыло много ссылок одновременно, мой браузер не смог их обработать!

superbo9y 09.04.2022 16:12
Формы c голосовым вводом в React с помощью Speechly
Формы c голосовым вводом в React с помощью Speechly
Пытались ли вы когда-нибудь заполнить веб-форму в области электронной коммерции, которая требует много кликов и выбора? Вас попросят заполнить дату,...
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Будучи разработчиком веб-приложений, легко впасть в заблуждение, считая, что приложение без JavaScript не имеет права на жизнь. Нам становится удобно...
Flatpickr: простой модуль календаря для вашего приложения на React
Flatpickr: простой модуль календаря для вашего приложения на React
Если вы ищете пакет для быстрой интеграции календаря с выбором даты в ваше приложения, то библиотека Flatpickr отлично справится с этой задачей....
В чем разница между Promise и Observable?
В чем разница между Promise и Observable?
Разберитесь в этом вопросе, и вы значительно повысите уровень своей компетенции.
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Клиент для URL-адресов, cURL, позволяет взаимодействовать с множеством различных серверов по множеству различных протоколов с синтаксисом URL.
Четыре эффективных способа центрирования блочных элементов в CSS
Четыре эффективных способа центрирования блочных элементов в CSS
У каждого из нас бывали случаи, когда нам нужно отцентрировать блочный элемент, но мы не знаем, как это сделать. Даже если мы реализуем какой-то...
0
4
23
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Я внес следующие изменения в ваш код:

  1. Удалено callback и использовано лямбда для открытия соответствующего видео на YouTube.
  2. Используется молния для попарного извлечения названия упражнения и ссылки на видео.

Если вы хотите узнать, почему я написал lambda x=link: webbrowser.open_new(x), а не lambda : webbrowser.open_new(link), обратитесь к этому вопрос.


Рабочий код:

from tkinter import *
import webbrowser

root = Tk()
root.title('Scrollbar text box')
root.geometry("600x500")


#my exercise list

FullExerciseList = [
    "Abdominal Crunches", 
    "Russian Twist",
    "Mountain Climber",
    "Heel Touch" ,
    "Leg Raises",
    "Plank",
    "Cobra Stretch",
    "Arm Raises",
    "Side Arm Raises",
    "Tricep Dips",
    "Arm Circles Clockwise",
    "Arm Circles Counter Clockwise",
    "Diamond Push Ups",
    "Jumping Jacks" ,
    "Chest Press Pulse",
    "Push Ups" ,
    "Wall Push Ups",
    "Triceps Stretch Left" ,
    "Tricep Stretch Right",
    "Cross Arm Stretch" ,
    "Rhomboid Pulls",
    "Knee Push Ups",
    "Arm Scissors",
    "Cat Cow Pose",
    "Child Pose",
    "Incline Push Ups",
    "Wide Arm Push Ups",
    "Box Push Ups",
    "Hindu Push Ups",
    "Side Hop",
    "Squats",
    "Side Lying Lift Left",
    "Side Lying Lift Right",
    "Backward Lunge",
    "Donkey Kicks Right",
    "Donkey Kick Left",
    "Left Quad Stretch",
    "Right Quad Stretch",
    "Wall Calf Raises"
    ]





#def yview function

def multiple_yview(*args):
    my_text1.yview(*args)
    my_text1.yview(*args)
    



#frame

my_frame = Frame(root)
my_frame.pack(pady=20)



#scrollbar

text_scroll = Scrollbar(my_frame)
text_scroll.pack(side = RIGHT, fill = Y)

# changed yscrollcommand=text_scroll to yscrollcommand=text_scroll.set
my_text1 = Text(my_frame, width=20, height=25, font=("Helvetica", 16), yscrollcommand=text_scroll.set, wrap='none')
my_text1.pack(side=RIGHT, padx=5)

#configuring scroll bar

text_scroll.config(command = multiple_yview)




vid_links = [
    "https://www.youtube.com/watch?v=RUNrHkbP4Pc&list=PLoVy-85EFtK92qMfHTNZi0BAA3T1AbDys&index=9", 
    "https://www.youtube.com/watch?v=Lha66p0ZXUc&list=PLoVy-85EFtK92qMfHTNZi0BAA3T1AbDys&index=62",
    "https://www.youtube.com/watch?v=Lha66p0ZXUc&list=PLoVy-85EFtK92qMfHTNZi0BAA3T1AbDys&index=62",
    "https://www.youtube.com/watch?v=YslHgg2E-Ro&list=PLoVy-85EFtK92qMfHTNZi0BAA3T1AbDys&index=95",
    "https://www.youtube.com/watch?v=_LGpDtENZ5U&list=PLoVy-85EFtK92qMfHTNZi0BAA3T1AbDys&index=64",
    "https://www.youtube.com/watch?v=dcJVA2sBPqw&list=PLoVy-85EFtK92qMfHTNZi0BAA3T1AbDys&index=92",
    "https://www.youtube.com/watch?v=kqnua4rHVVA",
    "https://www.youtube.com/watch?v=Fz4oo1vFo9M&list=PLoVy-85EFtK92qMfHTNZi0BAA3T1AbDys&index=81",
    "https://www.youtube.com/watch?v=DMwRPGMPB10&list=PLoVy-85EFtK92qMfHTNZi0BAA3T1AbDys&index=75",
    "https://www.youtube.com/watch?v=z21McHHOpAg&list=PLoVy-85EFtK92qMfHTNZi0BAA3T1AbDys&index=11",
    "https://www.youtube.com/watch?v=ATusl0jg4SU",
    "https://www.youtube.com/watch?v=UCmqw3kKZ38&list=PLoVy-85EFtK92qMfHTNZi0BAA3T1AbDys&index=60",
    "https://www.youtube.com/watch?v=SJ1Xuz9D-ZQ",
    "https://www.youtube.com/watch?v=SJ1Xuz9D-ZQ",
    "https://www.youtube.com/watch?v=9bR-elyolBQ&list=PLoVy-85EFtK92qMfHTNZi0BAA3T1AbDys&index=3",
    "https://www.youtube.com/watch?v=HE0ijmUc6Og&list=PLoVy-85EFtK92qMfHTNZi0BAA3T1AbDys&index=51",
    "https://www.youtube.com/watch?v=3WUUeM07i_Q&list=PLoVy-85EFtK92qMfHTNZi0BAA3T1AbDys&index=42",
    "https://www.youtube.com/watch?v=2W4ZNSwoW_4&list=PLoVy-85EFtK92qMfHTNZi0BAA3T1AbDys&index=2",
    "https://www.youtube.com/watch?v=jWxvty2KROs&list=PLoVy-85EFtK92qMfHTNZi0BAA3T1AbDys&index=7",
    "https://www.youtube.com/watch?v=DxBDqHL5NlM",
    "https://www.youtube.com/watch?v=dGKbTKLnym4&list=PLoVy-85EFtK92qMfHTNZi0BAA3T1AbDys&index=29",
    "https://www.youtube.com/watch?v=wQq3ybaLZeA&list=PLoVy-85EFtK92qMfHTNZi0BAA3T1AbDys&index=4",
    "https://www.youtube.com/watch?v=Fcbw82ykBvY&list=PLoVy-85EFtK92qMfHTNZi0BAA3T1AbDys&index=15",
    "https://www.youtube.com/watch?v=R08gYyypGto&list=PLoVy-85EFtK92qMfHTNZi0BAA3T1AbDys&index=13",
    "https://www.youtube.com/watch?v=DEyDbzSudEU&list=PLoVy-85EFtK92qMfHTNZi0BAA3T1AbDys&index=93",
    "https://www.youtube.com/watch?v=DxBDqHL5NlM",
    "https://www.youtube.com/watch?v=DJQGX2J4IVw&list=PLoVy-85EFtK92qMfHTNZi0BAA3T1AbDys&index=10",
    "https://www.youtube.com/watch?v=YslHgg2E-Ro&list=PLoVy-85EFtK92qMfHTNZi0BAA3T1AbDys&index=95",
    "https://www.youtube.com/watch?v=nYmUEJIBj3c&list=PLoVy-85EFtK92qMfHTNZi0BAA3T1AbDys&index=66",
    "https://www.youtube.com/watch?v=jgh6sGwtTwk",
    "https://www.youtube.com/watch?v=jgh6sGwtTwk",
    "https://www.youtube.com/watch?v=42bFodPahBU&list=PLoVy-85EFtK92qMfHTNZi0BAA3T1AbDys&index=76",
    "https://www.youtube.com/watch?v=JhX1nBnirNw&list=PLoVy-85EFtK92qMfHTNZi0BAA3T1AbDys&index=19",
    "https://www.youtube.com/watch?v=SaZK9vlSmHI",
    "https://www.youtube.com/watch?v=SaZK9vlSmHI",
    "https://www.youtube.com/watch?v=GQa_N7wft7M",
    "https://www.youtube.com/watch?v=EOf3cGIQpA4&list=PLoVy-85EFtK92qMfHTNZi0BAA3T1AbDys&index=71",
    "https://www.youtube.com/watch?v=pQUsUHvyoI0&list=PLoVy-85EFtK92qMfHTNZi0BAA3T1AbDys&index=43",
    ]


for item, link in zip(FullExerciseList, vid_links):
    button = Button(my_text1, text=item, command = lambda x=link: webbrowser.open_new(x)) 
    # inserting button into my_text1
    my_text1.window_create('end', window=button)
    # add a newline so that each button is in a separate line
    my_text1.insert('end', '\n')
    
root.mainloop()

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