从Python中另一个函数内部定义的函数内部返回

时间:2015-06-13 14:48:46

标签: python tkinter

我知道标题不是很清楚,所以我会尝试更深入地解释:

我在函数g中定义了一个函数f,我希望能够从g里面调用f,并使f make g返回一些东西。例如:

def g():
    def f():
        return(True) # I want g to return this value when f is called
    f() # I cannot replace this with return(f()) because the context of this problem is extremely weird.

因为人们已经请求了上下文:

class Color:
    def __init__(self, r, g, b):
        self.r = r
        self.g = g
        self.b = b

def requestColor(default=Color(0, 0, 0)):

    colorGUI = tk.Tk()
    colorGUI.title('Select Color')

    rLabel = Label(colorGUI, text='R: ', anchor=tk.E)
    gLabel = Label(colorGUI, text='G: ', anchor=tk.E)
    bLabel = Label(colorGUI, text='B: ', anchor=tk.E)

    rEntry = Entry(colorGUI)
    gEntry = Entry(colorGUI)
    bEntry = Entry(colorGUI)

    # this is one method that I want to have the return statement in
    def saveCommand():
        colorGui.destroy()
        return(Color(int(rEntry.get()), int(gEntry.get()), int(bEntry.get())))

    # this is another method that I want to have the return statement in
    def quitCommand():
        colorGui.destroy()
        return(Color(default.r, default.g, default.b))

    # I want to return the color when one of these buttons is pushed.
    saveButton = Button(colorGUI, text='SAVE', command=saveCommand)
    quitButton = Button(colorGUI, text='CANCEL'command=quitCommand)

    rEntry.insert(0, default.r)
    gEntry.insert(0, default.g)
    bEntry.insert(0, default.b)

    rLabel.grid(row=0, column=0, sticky=tk.E)
    rEntry.grid(row=0, column=1)
    gLabel.grid(row=1, column=0, sticky=tk.E)
    gEntry.grid(row=1, column=1)
    bLabel.grid(row=2, column=0, sticky=tk.E)
    bEntry.grid(row=2, column=1)
    quitButton.grid(row=3, column=0, sticky=tk.E+tk.W)
    saveButton.grid(row=3, column=1, sticky=tk.E+tk.W)

我做了这个方法,因为我希望能够按照以下方式做点什么:

newColor = requestColor(oldColor)

在我的计划中的几个地方。

2 个答案:

答案 0 :(得分:0)

如果不调用requestColor(),则无法调用saveCommand()或quitCommand()。不清楚为什么你需要这样的行为。更容易制作类并将这些方法称为类方法。例如:

class ColorHandler():
def __init__(self, color):
       self.color = color
       # do other 

  def requestColor(self, default=Color(0, 0, 0)):
      # set color properties
       self.color = color
       return self.color

  def saveCommand(self):
      return self.requestColor()


  def quitCommand(self):
     return self.requestColor()

答案 1 :(得分:0)

解决此问题的一种方法是使按钮命令修改现有的Color,而不是尝试返回新的Color

这是一个基于您的示例代码的工作演示:

import tkinter as tk
from tkinter import *

class Color:
    def __init__(self, r, g, b):
        self.r = r
        self.g = g
        self.b = b

def requestColor(default=Color(0, 0, 0)):

    # this will be modified later by the save command
    result = Color(default.r, default.g, default.b)

    colorGUI = tk.Tk()
    colorGUI.title('Select Color')

    rLabel = Label(colorGUI, text='R: ', anchor=tk.E)
    gLabel = Label(colorGUI, text='G: ', anchor=tk.E)
    bLabel = Label(colorGUI, text='B: ', anchor=tk.E)

    rEntry = Entry(colorGUI)
    gEntry = Entry(colorGUI)
    bEntry = Entry(colorGUI)

    def saveCommand():
        # set the new values
        result.r = int(rEntry.get())
        result.g = int(gEntry.get())
        result.b = int(bEntry.get())
        colorGUI.destroy()

    def quitCommand():
        # keep the default values
        colorGUI.destroy()

    saveButton = Button(colorGUI, text='SAVE', command=saveCommand)
    quitButton = Button(colorGUI, text='CANCEL', command=quitCommand)

    rEntry.insert(0, default.r)
    gEntry.insert(0, default.g)
    bEntry.insert(0, default.b)

    rLabel.grid(row=0, column=0, sticky=tk.E)
    rEntry.grid(row=0, column=1)
    gLabel.grid(row=1, column=0, sticky=tk.E)
    gEntry.grid(row=1, column=1)
    bLabel.grid(row=2, column=0, sticky=tk.E)
    bEntry.grid(row=2, column=1)
    quitButton.grid(row=3, column=0, sticky=tk.E+tk.W)
    saveButton.grid(row=3, column=1, sticky=tk.E+tk.W)

    colorGUI.mainloop()

    return result

color = requestColor()

print('Color(%s, %s, %s)' % (color.r, color.g, color.b))