Настройка кнопки, которая ссылается на сайт в зависимости от выбранного переключателя

#python #tkinter

#python #tkinter

Вопрос:

Итак, в настоящее время я создал кнопку, которая способна ссылаться на указанный сайт (жестко запрограммированный) в этом списке, как и предполагалось.

 urls = ['https://steamcharts.com/top',
        'https://spotifycharts.com/regional/global/weekly/latest',
        'https://www.anime-planet.com/anime/top-anime/week'
        ]

  

С помощью этого кода:

 def callback(url):
    webbrowser.open_new(url)

source_bttn = Button(win, text="Show Source", fg="blue", cursor="hand2")
source_bttn.pack()
source_bttn.bind("<Button-1>", lambda e: callback(urls[1])) 
  

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

 import webbrowser
from tkinter import *


# SETUP WINDOW ELEMENTS
win = Tk()
win.title("Setting Up GUI")
win.geometry("500x500")

# List elements
Titles = ["Steam Top Gamesn[Title and  Current Player Count]",
          "Top Weekly Spotify Songsn[Title and Artist]",
          "Trending Anime's Weeklyn[Title and Release Date]",
          "Steam Top Gamesn[3 October 2020]"
          ]
urls = ['https://steamcharts.com/top',
        'https://spotifycharts.com/regional/global/weekly/latest',
        'https://www.anime-planet.com/anime/top-anime/week'
        ]
Options = [(Titles[0]),
           (Titles[1]),
           (Titles[2]),
           ]
# Add RadioButtons   Labels to "Current #2" frame
# Create an empty dictionary to fill with Radiobutton widgets
option_select = dict()

# create a variable class to be manipulated by Radio buttons
ttl_var = StringVar(value=" ")

# Fill radiobutton dictionary with keys from game list with Radiobutton
# values assigned to corresponding title name
for title in Options:
    option_select[title] = Radiobutton(win, variable=ttl_var, text=title, value=title,
                                    justify=LEFT)
    # Display
    option_select[title].pack(fill='both')

# Creating button link
def callback(url):
    webbrowser.open_new(url)


source_bttn = Button(win, text="Show Source", fg="blue", cursor="hand2")
source_bttn.pack()
source_bttn.bind("<Button-1>", lambda e: callback(urls[1])) 

win.mainloop()
  

Мне интересно, есть ли способ включить эту callback функцию — каким-то образом в for title in Options:... строку кода переключателя.

Ответ №1:

Вы можете просто использовать a IntVar вместо a StringVar , а затем использовать значение для индексации urls в callback :

 ...

ttl_var = IntVar(value=0)

for num, title in enumerate(Titles[:-1]):
    option_select[title] = Radiobutton(win, variable=ttl_var, text=title,
                                       value=num, justify=LEFT)
    option_select[title].pack(fill='both')

def callback(event=None):
    webbrowser.open_new(urls[ttl_var.get()])

source_bttn = Button(win, text="Show Source", fg="blue", cursor="hand2")
source_bttn.pack()
source_bttn.bind("<Button-1>", callback)

...