亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

python 中的吸氣劑,tkinter

python 中的吸氣劑,tkinter

白豬掌柜的 2023-03-08 15:12:46
我需要訪問來自我的類“makeEntry”的信息,準確地說是文本變量。我試過 make get 函數,但我在 python 中讀到它是沒有必要的。def temp():    print(e_full_name.get_text())class makeEnetry:    def __init__(self, i_parent, i_width, i_row, i_column, i_text):        test.set(i_text)        test =  StringVar()        entry = Entry(master = i_parent, width = i_width, textvariable = test)        entry.grid(row = i_row, column = i_column, padx = 5, pady =5 )            def get_text(self):        return self.test.get()我試圖將我的 test = StringVar() 移動到函數上方,只是在類中以在另一個函數中引用它,但它不起作用。我是 python 的新手,我不知道我做錯了什么。def temp():    print(e_full_name.get_text())class makeEnetry:    test =  StringVar()    def __init__(self, i_parent, i_width, i_row, i_column, i_text):        test.set(i_text)...
查看完整描述

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()

界面:

http://img1.sycdn.imooc.com//6408359500016f1601770089.jpg

控制臺輸出:


僅供參考:我已經更改了輸入框中的文本并單擊按鈕。


>>> python3 test.py

TEST

TEST1

TEST12

TEST123


查看完整回答
反對 回復 2023-03-08
?
慕仙森

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來與之交互?


查看完整回答
反對 回復 2023-03-08
  • 2 回答
  • 0 關注
  • 105 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號