你有三個大問題。
首先,您從不啓動GUI。你最終需要像win.mainloop()
這樣的東西來實際做任何事情。
其次,您的按鈕實際上沒有佈置在框架內,所以您不會看到它。你需要像button.pack()
這樣的東西。
最後,您的command
是一個函數,它調用action()
,沒有參數。但是你已經定義它需要一個參數。所以,當你點擊它是傳統知識將記錄回溯看起來像這一切會發生:
Exception in Tkinter callback
Traceback (most recent call last):
File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-tk/Tkinter.py", line 1470, in __call__
return self.func(*args)
File "tkt.py", line 8, in <lambda>
button = Tk.Button(master=frame, text='press', command= lambda: action())
TypeError: action() takes exactly 1 argument (0 given)
爲了解決這個問題,要麼不不必要的self
參數添加到action
(這是一個函數,不是一種方法),或明確地傳遞一些虛擬物以在lambda
中匹配它。
雖然我們在這裏,lambda: action()
和action
本身完全一樣,除了更詳細,更難閱讀和更慢。您不應該在非原始字符串文字中使用未轉義的反斜槓。而且我們不妨去掉流浪的空間和PEP8--如果一切都保持一致。
所以,把他們放在一起:
import webbrowser
import Tkinter as Tk
def action():
webbrowser.open(r'C:\AgmPlots')
win = Tk.Toplevel()
frame = Tk.Frame(master=win).grid(row=1, column=1)
button = Tk.Button(master=frame, text='press', command=action)
button.pack()
win.mainloop()
一對夫婦的旁註:'拉姆達:動作()'不正是同樣的事情,只是過客'action',不同之處在於它更復雜,不易閱讀,而且速度較慢。你通常不想在函數中添加'self'參數;這是在類中的_methods_。 – abarnert