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())
4

1 回答 1

2

你遇到了三个大问题。

首先,您永远不会启动 GUI。你需要像win.mainloop()最后这样的东西来实际做任何事情。

其次,您的按钮实际上并未布置在框架内,因此您不会看到它。你需要类似的东西button.pack()

最后, yourcommand是一个不带参数调用的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(这是一个函数,而不是方法),要么显式传递一些 dummy 以在你的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 回答