2 回答
TA贡献1816条经验 获得超6个赞
我已经写了一个工作解决方案。正如我在评论中提到的,该test变量应该是一个实例变量 ( self)。为了更好地理解,我在我的示例代码中添加了一些注释。
代码:
import tkinter as tk
def temp():
print(entry_inst.get_text()) # Printing the result of "get_text" method of "entry_inst" object.
root = tk.Tk()
class makeEnetry:
def __init__(self, i_parent, i_width, i_row, i_column, i_text):
self.test = tk.StringVar()
self.test.set(i_text)
entry = tk.Entry(master=i_parent, width=i_width, textvariable=self.test)
entry.grid(row=i_row, column=i_column, padx=5, pady=5)
def get_text(self):
return self.test.get()
entry_inst = makeEnetry(root, 20, 1, 1, "TEST") # Creating an object from "makeEnetry" class
button = tk.Button(root, text="PUSH ME", command=temp) # Creating a button which will call the "temp" function
button.grid(row=2, column=1)
tk.mainloop()
界面:
控制台输出:
仅供参考:我已经更改了输入框中的文本并单击按钮。
>>> python3 test.py
TEST
TEST1
TEST12
TEST123
TA贡献1827条经验 获得超7个赞
您希望外部函数可以访问的任何变量都需要是一个实例变量。
例如,如果您使用self.test = StringVar(), 并self.test在类中的任何地方使用而不是仅使用test,那么任何引用该类实例的代码都可以访问该变量。
the_entry = makeEnetry(root, 20, 1, 1, "Hello, world!")
...
print(the_entry.test.get())
但是,创建 getter 或 setter 并没有错。例如,StringVar有一个 getter( .get()) 和 setter( .set(...))。创建 getter 和 setter 的优点是它将内部实现与外部接口分开。使用 getter 或 setter,您可以隐藏您正在使用的事实StringVar,调用者不需要知道。
函数、实例变量以及 getter 和 setter 的问题在于您正在创建用户界面或 API。您正在创建一个对象,然后告诉外界“这就是您与该对象交互的方式”。有时 getter 和 setter 有意义,有时则不然。这取决于您希望对象 UI/API 是什么,以及您是否希望向外界公开内部实现细节。
在这种特定情况下,它似乎the_entry.get_text()是一个更干净的接口,the_entry.test.get(...)因为它使您可以更自由地更改内部实现,而不会影响使用该对象的代码。这一切都归结为您希望外部代码如何与您创建的对象进行交互。调用者应该知道这个对象使用 a StringVar,还是应该只知道它可以调用get_text来与之交互?
添加回答
举报