我知道标题不是很清楚,所以我会尝试更深入地解释:
我在函数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)
在我的计划中的几个地方。
答案 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))