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條經驗 獲得超8個贊
您希望外部函數可以訪問的任何變量都需要是一個實例變量。
例如,如果您使用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來與之交互?
添加回答
舉報