我正在用Python做虚拟助手。我有一个用于提示的类,一个用于处理请求的当前为空的类,并将有一个用于显示结果的类。
这是我的代码:
#Pysistant
#Google Assistant clone(ish) built with Python and Tkinter
import tkinter as tk
class Prompt:
def __init__ (self, typ, message):
self.window = tk.Tk()
self.message = message
self.typ = typ.lower()
if typ == "one line":
self.text = tk.Label(self.window, text=self.message)
self.frame = tk.Frame(self.window)
self.entry = tk.Entry(self.frame)
self.button = tk.Button(self.frame, text="Done", command=lambda: self.command_wrapper(self.entry.get().lower()))
self.text.pack()
self.entry.pack()
self.button.pack()
self.frame.pack()
def command_wrapper(self, query):
if "math" or "calc" in query:
func = "math"
params = query[5:]
self = Command(func, params)
def quit(self):
self.window.destroy()
class Command:
def __init__(self, func, params):
self.window = tk.Tk()
self.func = func
self.params = params
self.text = tk.Label(self.window, text="Processing your request")
self.text.pack()
self.quit()
###TODO: Create subclasses for different functions
instance = Prompt('one line', "What would you like to accomplish today?")
我希望实例在调用Command
之后引用一个command_wrapper()
对象,但是它引用一个Prompt
对象。调用instance.quit()
只会破坏提示窗口。
答案 0 :(得分:0)
不确定我是否正确理解了这个问题-这是您要寻找的吗?
def command_wrapper(self, query):
if "math" or "calc" in query:
func = "math"
params = query[5:]
return Command(func, params)
答案 1 :(得分:0)
对Prompt
实例self
的引用没有被这样的赋值self = Command(func, params)
取代(在command_wrapper
方法内),而只是该上下文中的局部变量。>
您的短语“我希望实例引用一个Command
对象” 表示使用 委派 的意图。 br />
为委托定义一个附加字段,例如self._command = None
(在Prompt
构造函数内)。
修改command_wrapper
以设置一个委托人self._command = Command(func, params)
。
更改quit
方法以销毁内部 command 窗口:
def quit(self):
self._command.window.destroy()
但是,要最终销毁最初的 prompt 实例窗口,您必须直接调用它:prompt_instance.window.destroy()
。