2014-09-22 130 views
0

我有一个数组,它包含一些URL。Python创建动态按钮

我基本上想在tk内创建一个按钮,在浏览器中打开url。

到目前为止,我已经有了创建按钮,但是,当我运行.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会更容易 - 但是我是新来的,仍然挑选了一些东西!

回答

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创建了一个新函数 - 当不带任何参数调用时,该函数将调用urlOpen以及正确的url。 (请注意,我使用标准lambda x=y: x技巧来确保lambda函数在循环中选取正确的url)。

+0

太棒了!谢谢你 - 第一次工作。 – oliversarfas 2014-09-22 14:53:38