0

こんにちは、私は Window7 OS で 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())
4

1 に答える 1

2

3 つの大きな問題があります。

まず、GUI を起動することはありません。win.mainloop()実際に何かを行うには、最後のようなものが必要です。

次に、ボタンは実際にはフレーム内に配置されていないため、表示されません。のようなものが必要ですbutton.pack()

最後に、 yourは引数なしでcommandを呼び出す関数です。action()しかし、パラメーターを必要とするように定義しました。したがって、クリックしたときに起こることは、Tk が次のようなトレースバックをログに記録することだけです。

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()
于 2013-10-16T03:26:37.560 に答える