在 Python 3 和 tkinter 中使用变量调用函数

Posted

技术标签:

【中文标题】在 Python 3 和 tkinter 中使用变量调用函数【英文标题】:Using a variable to call a function in Python 3 and tkinter 【发布时间】:2015-08-13 01:10:05 【问题描述】:

我想调用几个不同的函数,但我想使用一个变量的值来执行它。我在 tkinter 中使用按钮来更改变量的值,以及一个选择随机变量的按钮和一个显示当前值的标签(我在下面的代码中省略了这个)。我有另一个按钮,它创建一个 AskYesNo 消息框,以从用户那里确认选择的按钮/变量值是否正确。如果用户选择否,则返回到根窗口。如果用户选择是,我希望程序调用与变量关联的函数。

我是 Python 和 tkinter 的初学者,所以请不要假设我对简单的编码一无所知。谢谢。

下面是一些示例代码:

import random
from tkinter import *
from tkinter import ttk
from tkinter import messagebox

root = Tk()

global tempchoice
global foo

tempchoice = StringVar()
item = StringVar()

def afunc():
    foo.set('A')
    tempchoice.set('afuncaction')
    return()

def afuncaction():
    print("Function A called")
    return


def bfunc():
    foo.set('B')
    tempchoice.set('bfuncaction')
    return()

def bfuncaction():
    print("Function B called")
    return


def mystery():
    item = ['afuncaction', 'bfuncaction']
    result = random.choice(item)
    foo.set("Mystery") 
    tempchoice.set(result)
    return()


def confirm():
    n = messagebox.askyesno("Selected Choice", "Call " + foo.get() + "?")
    if n:
        tempchoice
    return


aButton = Button(root, text="A Function",command=afunc)
aButton.grid(row=0, column=0, sticky=W+E+N+S)

bButton = Button(root, text="B Function",command=bfunc)
bButton.grid(row=1, column=0, sticky=W+E+N+S)

quitButton = Button(root, text="Quit", command=exit)
quitButton.grid(row=7, column=0, sticky=W+E+N+S)

confirmButton = Button(root, text="Confirm", command=confirm)
confirmButton.grid(row=7, column=7)


root.mainloop()

【问题讨论】:

“与变量关联的函数”是指负责变量当前值的函数,例如afunc() 如果是'A' 如果用户点击 A 按钮,则调用 afunc,将 tempchoice 设置为 afuncaction。 afuncaction 仅在按下 Confirm 按钮然后用户选择 Yes 时才会调用。 【参考方案1】:

如果您想使用函数名称作为字符串调用函数,请参阅此问题/答案 - Calling a function of a module from a string with the function's name in Python

几个例子:

首先在global symbol table中查找函数-

def foo(): 
  print 'hello world'

globals()['foo']()
# > hello world

或者第二个,如果你的函数是一个类的方法 -

class Foo(object): 
  def bar(self): 
    print 'hello world'

foo = Foo()

getattr( foo, 'bar' )()
# > hello world

【讨论】:

因此,如果我在 Confirm 函数中使用其中一种方法,它将调用当前设置为 tempchoice 值的任何函数? 你有 tempchoice 作为一个类的实例,我假设它有一个成员字符串,你在其中存储函数名称。您必须取回该值并使用 is 作为从符号表中查找函数的键,就像我的第一个示例一样。 我不会推荐 globals() 作为第一选择。 @TigerhawkT3 同意。将提供的代码包装在一个类中会更好【参考方案2】:
def afunc():
    foo.set('A')
    tempchoice.set('afuncaction')
    global myfunc
    myfunc = afuncaction # save a reference to this function

...

if messagebox.askyesno:
    myfunc()

顺便说一句,return 后面不需要括号。这是一个语句,而不是一个函数。并且没有必要将它放在每个函数的末尾 - 如果一个函数到达其可用语句的末尾,它将自动 return(返回值 None)。

【讨论】:

以上是关于在 Python 3 和 tkinter 中使用变量调用函数的主要内容,如果未能解决你的问题,请参考以下文章

在 tkinter 中输入希腊字符

如何在 python 3.4 tkinter“索引错误:列表索引超出范围”中修复此错误

tkinter python 入口高度

使用python 3.5在centos 6.5上安装tkinter

tkinter如何将一个部件透明??

Tkinter 在 Python 3.6 中未知 [重复]