Привязать команду кнопки python tkinter, чтобы открыть определенную ссылку в списке ссылок?

Я использую цикл for для размещения сетки кнопок 3 x 3 в функции create_widgets().

У меня возникли проблемы с привязкой каждой конкретной кнопки к ссылке в 'link_list' (в методе инициализации dunder).

В моем коде он (по понятным причинам) пытается проиндексировать list_list на основе переменной «button_number», которая всегда будет вне диапазона, потому что она каждый раз добавляет 1, а по завершении это выводит его за пределы допустимого диапазона. Я ищу помощь в создании решения, где либо

  1. команда кнопки динамически индексирует / разрезает список на основе номера / местоположения кнопки ИЛИ
  2. Команда кнопки конкретизируется функцией webbrowser.open() и ссылкой, которой она соответствует в индексе при создании.

Я также не уверен, что один из них более выгоден, чем другой.

(К вашему сведению, цель: я создаю личный командный центр, чтобы открывать как настольные приложения, так и веб-ссылки из одного места, и я считаю, что список является хорошей отправной точкой для сбора важных ссылок, которые я бы хотел, чтобы он открывался.)

Большое спасибо за то, что подумали о помощи

Вот моя программа так далеко:

      import tkinter as tk
import os
import random
import webbrowser
from tkinter import Frame
class Application(tk.Frame):
    def __init__(self, master = None):
        super().__init__(master)
        self.master = master
        self.grid()
        self.create_widgets()
        self.link_list = ['evernote:///view/21614375/s192/10b4247b-5f09-4b66-953d-02e5f27aac3c/10b4247b-5f09-4b66-953d-02e5f27aac3c/',
                        'Anaconda-Navigator://', 'zoom.us://', 'Evernote://', 'Messages://',
                        'https://open.spotify.com/track/2gI9RfuSwulsBujm7hbOFv?si=891addaca9524eaf',
                        'spotify://', 'workflowy://', 'Brave-Browser://']

    def create_widgets(self):
        
        self.button_number = 0
        #for loop button creation
        for i in range(3):
            for j in range(3):
                #first button
                self.first_button = tk.Button(self, state = 'normal', padx =50, pady = 50)
                self.first_button["text"] = "BUTTON",self.button_number
                self.first_button["command"] = lambda: webbrowser.open(self.link_list[self.button_number])
                #self.first_button["command"] = self.lets_go
                self.first_button.grid(row = i, column = j)
                self.button_number += 1

        ##QUIT BUTTON
        self.quit = tk.Button(self, text="QUIT", fg="red",
                              command=self.master.destroy)
        self.quit.grid()

    #for First Button
    def lets_go(self):
        webbrowser.open(self.link_list[self.button_number])   #, new = 0 )


root = tk.Tk()
app = Application(master = root)
app.mainloop()

1 ответ

Вот способ сделать это:

      from tkinter import Tk, Button
import webbrowser
from functools import partial

link_list = ['evernote:///view/21614375/s192/10b4247b-5f09-4b66-953d-02e5f27aac3c/10b4247b-5f09-4b66-953d-02e5f27aac3c/',
             'Anaconda-Navigator://', 'zoom.us://', 'Evernote://', 'Messages://',
             'https://open.spotify.com/track/2gI9RfuSwulsBujm7hbOFv?si=891addaca9524eaf',
             'spotify://', 'workflowy://', 'Brave-Browser://']

root = Tk()

row = 0
col = 0
for index, link in enumerate(link_list):
    Button(root, text=f'Button {index + 1}', command=partial(webbrowser.open, link)).grid(row=row, column=col)
    col += 1
    if col >= 3:
        col = 0
        row += 1

root.mainloop()

В основном что partial() do is всегда выполняет заданную функцию каждый раз с одними и теми же аргументами.

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