【问题标题】:Tying a python tkinter button command, to open a specific link, in a list of links?在链接列表中绑定 python tkinter 按钮命令以打开特定链接?
【发布时间】:2021-05-13 14:05:36
【问题描述】:

我正在使用 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()

【问题讨论】:

  • 顺便说一句,mainloop() 通常是在 Tk() 实例而不是框架上调用的
  • 非常感谢@Matiiss -- 你知道这是为什么吗?
  • 我其实不知道,理论上可以单独调用mainloop(),但这是不好的做法。可能原因是 Tk() 实例是其他一切都基于的主实例,因此在主实例上调用 .mainloop() 是有意义的。

标签: python tkinter tkinter-button


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

About partial()
Other source for partial()

【讨论】:

  • 哇!这太棒了!非常感谢您花时间展示和解释 partial() 函数另外,我喜欢您导航映射按钮的方式,无论 link_list 中有多少,它总是会很好
  • 谢谢,顺便说一句,我添加了一些可能更好地解释 partial() 的来源。
  • 摇滚吧!这么好的功能,哇。感谢您的努力,我们拥有一个多么棒的社区
  • 顺便说一句,我不得不提一下,据我所知,在这种情况下也可以使用 command=lambda link=link: webbrowser.open(link) 并且它应该以相同的方式工作,只是我喜欢使用partial() 更多,在我看来它更具可读性,特别是如果必须使用很多参数,但它也有其他用途,我认为,我真的不知道,因为我只是为此使用。
猜你喜欢
  • 2021-09-27
  • 1970-01-01
  • 1970-01-01
  • 2018-09-30
  • 2016-04-16
  • 1970-01-01
  • 2012-06-17
  • 2021-11-22
  • 1970-01-01
相关资源
最近更新 更多