在链接列表中绑定 python tkinter 按钮命令以打开特定链接?

问题描述

我正在使用 for 循环在 create_widgets() 函数中布局一个 3 x 3 的按钮网格。

我无法将每个特定按钮链接到“link_list”中的链接(在 dunder init 方法中)。

在我的代码中,它(可以理解)尝试根据变量“button_number”对 list_list 进行索引,该变量将始终超出范围,因为它每次都加 1,并在完成时将其超出范围。我正在寻求帮助以构建一个解决方案,其中任一

  1. 按钮的命令根据按钮的数量/位置动态索引/切片列表或
  2. 按钮的命令通过 webbrowser.open() 函数和它在创建时在索引中匹配的链接具体化

我也不确定一个是否比另一个更有利。

(仅供参考,目标是:我正在构建一个个人命令中心,以便从一个位置打开桌面应用程序和 Web 链接,我认为列表是一个很好的起点,可以收集我希望它打开的重要链接。 )

非常感谢您考虑提供帮助

以下是我目前的程序:

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()

解决方法

这是一种方法:

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() 所做的总是每次都使用相同的给定参数执行给定的函数,或者至少这将是我对这种情况的最佳解释。

About partial()
Other source for partial()

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...