2012-01-05 3 views
2
from Tkinter import * 
import webbrowser 

root = Tk() 
frame = Frame(root) 
frame.pack() 

url = 'http://www.sampleurl.com' 

def OpenUrl(url): 
    webbrowser.open_new(url) 

button = Button(frame, text="CLICK", command=OpenUrl(url)) 

button.pack() 
root.mainloop() 

Моя цель - открыть URL-адрес, когда я нажимаю кнопку в виджетах графического интерфейса. Однако я не уверен, как это сделать. Python открывает два новых окна, когда я запускаю сценарий, не нажимая ничего. Кроме того, ничего не происходит, когда я нажимаю кнопку.Python 2.7 Tkinter open webbrowser нажмите

ответ

3

Вы должны использовать

button = Button(root, text="CLCK", command=lambda aurl=url:OpenUrl(aurl)) 

это правильный способ передачи обратного вызова, когда требуются аргументы.
От here:

ошибка Распространенного новичка является вызов функции обратного вызова при построения виджета. То есть, вместо того, чтобы давать только имя функции (например «обратный вызов»), программист добавляет скобки и значения аргументов функции:

Если вы сделаете это, Python будет вызывать функцию обратного вызова, прежде чем создавать виджет с , и передайте возвращаемое значение функции в Tkinter. Затем Tkinter пытается преобразовать возвращаемое значение в строку и сообщает Tk вызвать функцию с этим именем, когда кнопка активирована. Это , вероятно, не то, что вы хотели.

Для простых случаев, как это, вы можете использовать лямбда-выражение в качестве связующего звена между Tkinter и функции обратного вызова:

0

В качестве альтернативы, вы не должны передать URL в качестве аргумента команды , Очевидно, что ваш метод OpenUrl застрял бы, открыв в этом случае один URL-адрес, но он будет работать.

from Tkinter import * 
import webbrowser 

url = 'http://www.sampleurl.com' 

root = Tk() 
frame = Frame(root) 
frame.pack() 

def OpenUrl(): 
    webbrowser.open_new(url) 

button = Button(frame, text="CLICK", command=OpenUrl) 

button.pack() 
root.mainloop() 
Смежные вопросы