为了账号安全,请及时绑定邮箱和手机立即绑定

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

界面:

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

控制台输出:


仅供参考:我已经更改了输入框中的文本并单击按钮。


>>> python3 test.py

TEST

TEST1

TEST12

TEST123


查看完整回答
反对 回复 2023-03-08
?
慕仙森

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来与之交互?


查看完整回答
反对 回复 2023-03-08
  • 2 回答
  • 0 关注
  • 75 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信