2014-09-22 235 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