13

我如何获得返回值 A 到 C?顺便说一句,我没有使用类。

def button:
    mylabel = Label(myGui, text = "hi").grid(row = 0, column = 0)
    A = B.get()
    return A

B = StringVar()
C = ""
myentry = Entry(myGui, textvariable = B).grid(row = 1, column = 0)
Submit = Button(myGui, text = "Submit", command = button).grid(row = 1, column = 1)
4

7 回答 7

18

简短的回答:你不能。回调不能返回任何东西,因为没有地方可以返回它——除了事件循环,它不对返回值做任何事情。

在基于事件的应用程序中,您通常会在类上设置一个属性。或者,如果您是初学者,您可以设置一个全局变量。对于必须随时间维护的实际代码,使用全局变量不是一个好主意,但对于实验来说是可以的。

因此,例如,由于C在您的示例中似乎是一个全局变量,您可以执行以下操作:

def button():
    global C
    mylabel = Label(myGui, text = "hi").grid(row = 0, column = 0)
    A = B.get()
    C = A
于 2012-10-27T14:27:08.320 回答
5

您可以C.setbutton函数内部调用:

def button:
    mylabel = Label(myGui, text = "hi").grid(row = 0, column = 0)
    A = B.get()
    C.set(A)
    # return A   # return values are useless here
于 2012-10-27T12:02:07.833 回答
4

老问题,但大多数答案都建议使用全局变量。我不喜欢在我的项目中使用太多的全局变量,所以这是我的解决方案。

声明 Tkinter 按钮时,可以使用 lambda 函数作为命令。此 lambda 可以与与您正在定义的按钮位于同一命名空间中的变量进行交互。请务必在初始化按钮之前定义此变量。

def button():
    mylabel = Label(myGui, text = "hi").grid(row = 0, column = 0)
    A = B.get()
    return A

B = StringVar()
C = ""
myentry = Entry(myGui, textvariable = B).grid(row = 1, column = 0)
Submit = Button(myGui, text = "Submit", command = lambda: C=button()).grid(row = 1, column = 1)

您可能需要根据您的项目组织self作为论据,但概念是相同的。buttonLambda 命令对于将参数传递给按钮命令也很有用。

于 2017-10-19T15:42:48.260 回答
2

只需将 A 声明为全局变量即可。

def button:
global A
mylabel = Label(myGui, text = "hi").grid(row = 0, column = 0)
A = B.get()
return A

B = StringVar()`
C = ""
myentry = Entry(myGui, textvariable = B).grid(row = 1, column = 0)
Submit = Button(myGui, text = "Submit", command = button).grid(row = 1, column = 1)
# and then A is not empty
B= A
于 2015-05-10T21:42:42.357 回答
1

您创建Tkinter.Tk的子类,并在该类中定义成员变量self.A。然后你可以通过模仿返回行为

self.A = B.get()

请参阅,Tkinter 文本条目的返回值,关闭 GUI

于 2018-06-13T20:31:48.917 回答
0

有两种方法可以做到这一点:1)全局变量 2)将要返回的变量存储在另一个类中:

1)定义您在按钮中使用的功能:

def yourFunction (x):
    global variab
    variab = x

将功能转移到您的按钮:

button = Button (root, command=lambda: yourFunction (x))

我知道你不喜欢使用太多的全局变量,所以有第二种解决方案:

  1. 创建一个存储返回变量的类:
class ClassToStoreReturnedVariable:
    def __init__ (self):
        self.returnedVariable = None

    def returnVariable (self, x):
        self.returnedVariable = x


returnedVariable = ClassToStoreReturnedVariable ()


class YourButton:
    def __init__ (self):
        self.anotherThing = None
        self.button = Button (root, command=lambda: returnedVariable.returnVariable (x))
        self.pack ()

按钮必须写在按钮类的末尾,因为您可能想使用 self. 如果 init 没有创建自我,那么在您将功能转移到按钮之前,这样的功能将不起作用。并且不要忘记打包或网格化它。

于 2021-10-12T20:52:34.393 回答
0

答案 3 是最佳选择。

但我认为这发生了一个小错误(可能在 python 3 中)。

你必须写:

 Submit = Button(myGui, text = "Submit", command = lambda:C==button()).grid(row 
 = 1, column = 1)

查看“lambda: C==...”中的双“==”。

行得通。

所以代码列是:

def button():
mylabel = Label(myGui, text = "hi").grid(row = 0, column = 0)
A = B.get()
return A

B = StringVar()
C = ""
myentry = Entry(myGui, textvariable = B).grid(row = 1, column = 0)
Submit = Button(myGui, text = "Submit", command = lambda: C==button()).grid(row = 1, column = 1)

(......和代码的其余部分)

于 2020-12-17T16:21:55.223 回答