Python创建动态按钮

时间:2014-09-22 14:48:16

标签: python url browser tkinter

我有一个数组,其中包含一些网址。

我基本上想在tk中创建一个按钮,用于在浏览器中打开网址。

到目前为止,我已经创建了按钮,但是,当我运行.py文件时,似乎打开页面的功能正在被击中 - 没有为按钮做好准备。

import tkinter as tk
import webbrowser as Web
urls = [[1, 'http://www.google.co.uk','Google'],[2, 'http://www.bbc.co.uk','BBC']];

def urlOpen(target):
    Web.open(target)

window = tk.Tk()
window.overrideredirect(1)
window.update_idletasks()    

for url in urls:
    urlTarget = url[0]
    labelurl = tk.Button(window, text=url[2], height = 2, command = urlOpen(url[1]), width = 10)
    labelurl.grid(row = url[0] + 1 , column = 1)

close = tk.Button(window, text = 'Quit',  command = window.destroy, width = 10)
close.grid(row = len(urls) + 2, column = 1)
window.mainloop()

我知道,使用OOP python会更容易 - 不过我是新手,并且还在挑选!

1 个答案:

答案 0 :(得分:0)

发生的事情是你在创建按钮时调用该函数 - 而不是在点击它时调用该函数:

labelurl = tk.Button(window, text=url[2], height = 2, command = urlOpen(url[1]), width = 10)

您需要的是推迟函数调用:

for url in urls:
    onclick = lambda url=url[1]: urlOpen(url)
    labelurl = tk.Button(window, text=url[2], height = 2, command = onclick, width = 10)
    labelurl.grid(row = url[0] + 1, column = 1)

这里我为每个url创建了一个新函数 - 当没有参数调用时,该函数将使用正确的url调用urlOpen。 (注意我正在使用标准的lambda x=y: x技巧来确保lambda函数在循环中获取正确的url。)