python - 与 Tkinter 跟踪关联的回调函数有哪些限制?

标签 python user-interface tkinter

我正试图弄清楚如何实现一个回调函数,它做的事情比打印输出更有意义。我相当缺乏经验,所以我不确定回调函数应该或可以如何在 Python(或任何其他语言,就此而言)中实现。

考虑以下 Python 代码:

from Tkinter import *

def callbackfunc(*args):
  print "Hello World!"

class App:

  def __init__(self, master):
    frame = Frame(master)
    frame.pack()

    optionvalue = IntVar(master)
    optionvalue.set(2)
    optionvalue.trace("w", callbackfunc)
    self.optionmenu = OptionMenu(master, optionvalue, 1, 2, 3, 4)
    self.optionmenu.pack()

我正在尝试实现一个 OptionMenu(一个 Tkinter 小部件),这样当它的选定值发生变化时,我的回调函数会做一些有意义的事情——更具体地说,它将改变一个全局变量值,该值在程序的其他地方定义.正如上面的实现,它只是打印输出(虽然成功)。

我不知道如何将参数传递给我的回调函数。我不希望这个特定的回调函数返回任何东西;但是,我很好奇如何让我的回调函数返回一些东西,以及我将如何实现我的程序的其余部分,以便它可以利用那些返回的结果,无论这些结果是什么。我是否试图以一种不打算实现的方式实现 Python 回调函数?如果没有,我该如何使它发挥作用?

最佳答案

有点不清楚“将参数传递给我的回调函数”是什么意思。你已经在这样做了!例如:

from Tkinter import *

def callbackfunc(*args, **kwargs):
    print args, kwargs
    print "Hello World!"

class App(object):
    def __init__(self, master):
        frame = Frame(master)
        frame.pack()

        optionvalue = IntVar(master)
        optionvalue.set(2)
        optionvalue.trace("w", callbackfunc)
        self.optionmenu = OptionMenu(master, optionvalue, 1, 2, 3, 4)
        self.optionmenu.pack()

root = Tk()
app = App(root)
root.mainloop()

运行时...

$ python foo.py 
('PY_VAR0', '', 'w') {}
Hello World!

所以你看,当 Tkinter 调用你的回调时,它向它传递参数。如果你想做一些除了打印它们之外的事情,你可以通过传递一个方法而不是一个函数来将它们存储在某种状态。

from Tkinter import *

class App(object):
    def __init__(self, master):
        frame = Frame(master)
        frame.pack()

        optionvalue = IntVar(master)
        optionvalue.set(2)
        optionvalue.trace("w", self.callbackfunc)
        self.optionmenu = OptionMenu(master, optionvalue, 1, 2, 3, 4)
        self.optionmenu.pack()
        self.state = []

    def callbackfunc(self, *args):
        self.state.append(args)
        print self.state


root = Tk()
app = App(root)
root.mainloop()

运行时...

$ python foo.py 
[('PY_VAR0', '', 'w')]
[('PY_VAR0', '', 'w'), ('PY_VAR0', '', 'w')]
[('PY_VAR0', '', 'w'), ('PY_VAR0', '', 'w'), ('PY_VAR0', '', 'w')]

此外,也许您想要访问 optionvalue 的值。然后您可以保存对它的引用:

from Tkinter import *

class App(object):
    def __init__(self, master):
        frame = Frame(master)
        frame.pack()

        self.optionvalue = IntVar(master)
        self.optionvalue.set(2)
        self.optionvalue.trace("w", self.callbackfunc)
        self.optionmenu = OptionMenu(master, self.optionvalue, 1, 2, 3, 4)
        self.optionmenu.pack()
        self.state = []

    def callbackfunc(self, *args):
        self.state.append(args)
        print self.state
        print self.optionvalue.get()


root = Tk()
app = App(root)
root.mainloop()

运行时...

$ python foo.py 
[('PY_VAR0', '', 'w')]
1
[('PY_VAR0', '', 'w'), ('PY_VAR0', '', 'w')]
2
[('PY_VAR0', '', 'w'), ('PY_VAR0', '', 'w'), ('PY_VAR0', '', 'w')]
3

您还可以将 root.getvar(name)name = 'PY_VAR0'(传递给回调的第一个参数)一起使用,如 noob oddy建议。

关于python - 与 Tkinter 跟踪关联的回调函数有哪些限制?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9865936/

相关文章:

java - 为什么出现 java.io.NotSerializedException : javax. swing.plaf.metal.MetalFileChooserUI?

python - 使用 python 2.7.3 Mac OSX 10.8.2 导入 Tkinter 失败

python Tkinter focus_set() 在捕获按键事件时无法正常工作

python - 在 Tkinter 中使用全局参数的替代方法

python - 重新组织 sqlite 中的数据结构(使用 COUNT?)

python - 使用 MoviePy 或 FFmpeg 连接 Python 列表中的电影

python - 我如何在 django 重定向中使用 kwargs,我有一个错误

python - Google Cloud Vision Logo 检测 API - 无法识别 Logo

Drupal 7 - 管理 - 按字段值查找节点

python - wxPython - 标题边框