【发布时间】:2021-05-13 14:05:36
【问题描述】:
我正在使用 for 循环在 create_widgets() 函数中布局一个 3 x 3 的按钮网格。
我无法将每个特定按钮链接到“link_list”中的链接(在 dunder init 方法中)。
在我的代码中,它(可以理解)尝试根据变量“button_number”对 list_list 进行索引,该变量总是超出范围,因为它每次都加 1,并且在完成时,它超出了范围。我正在寻求帮助来构建一个解决方案,其中任一
- 按钮的命令根据按钮的数量/位置动态索引/切片列表或
- 按钮的命令使用 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