gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-30 02:22:34 25 4
gpt4 key购买 nike

我正试图弄清楚如何实现一个回调函数,它做的事情比打印输出更有意义。我相当缺乏经验,所以我不确定回调函数应该或可以如何在 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com