2013-10-16 22 views
0

嗨我在Window7操作系統上使用Python27,我試圖用按鈕創建一個Tk GUI,當按下按鈕時會出現一個文件目錄。但下面的代碼不會做任何事情。我錯過了什麼嗎?創建一個帶可執行按鈕的圖形用戶界面

import webbrowser 
import Tkinter as Tk 

def action(self): 
    webbrowser.open ('C:\AgmPlots') 

win = Tk.Toplevel() 
frame = Tk.Frame(master=win).grid(row=1, column=1) 
button = Tk.Button(master=frame, text='press', command= lambda: action()) 
+1

一對夫婦的旁註:'拉姆達:動作()'不正是同樣的事情,只是過客'action',不同之處在於它更復雜,不易閱讀,而且速度較慢。你通常不想在函數中添加'self'參數;這是在類中的_methods_。 – abarnert

回答

3

你有三個大問題。

首先,您從不啓動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()