Python 使用tkinter';s按钮和条目小部件以更新实例变量
我正在尝试实现一个小应用程序,让用户登录,登录后的用户可以向文本文件添加/更新/删除内容。以下是我到目前为止所掌握的代码的大致草图:Python 使用tkinter';s按钮和条目小部件以更新实例变量,python,class,oop,tkinter,tkinter-entry,Python,Class,Oop,Tkinter,Tkinter Entry,我正在尝试实现一个小应用程序,让用户登录,登录后的用户可以向文本文件添加/更新/删除内容。以下是我到目前为止所掌握的代码的大致草图: class admin(): def __init__(self): self.app = Tk() . self.name=StringVar() update = Button(self.app,....,comma
class admin():
def __init__(self):
self.app = Tk()
.
self.name=StringVar()
update = Button(self.app,....,command=self.update)
.
.
.
def update():
#Function to take different entries using Entry widget of tkinter in another window
anotherapp = Tk()
nameentry = Entry(anotherapp,textvariable = self.name)
submitbutton = Button(anotherapp,....,command=submit)
.
.
def submit():
#Opens a file and adds entries to a textfile.
namevar = self.name.get()
# code to append to file
为了解释以上内容,我有一个类管理员。创建这个类的实例将打开一个窗口,窗口中有创建、更新、删除等按钮。单击其中一个按钮,将调用相应的函数(在同一类中定义)(我使用lambda:
以防函数有参数,但到目前为止,它没有)
因此,在我提到的代码中,比如我单击Update按钮,它应该调用Update函数,该函数打开另一个窗口并获取文本文件中必须更新的文本(通过Entry小部件)。因此,根据代码,它将更新name的值。单击提交时,函数submit使用.get()
获取name的字符串值,并将其附加到文本文件中
代码执行时没有错误,但不会从用户处读取输入。当我点击submit按钮时,空行会附加到我的文本文件中
现在我不明白为什么这不起作用。name
变量在init中定义,可由同一类的函数更新。我已经尝试了很多方法来实现这一点,包括在按钮命令中添加参数、在其他地方定义name
,等等。尽管我已经解决了错误,但我得到了相同的结果:该文件附加了空行。我还尝试将name设置为类变量,但这不起作用,因为它是使用StringVar()声明的,而StringVar()需要将其作为tkinter窗口的一部分。我想我也尝试过在update
函数中嵌套submit
函数,但我不知道为什么没有成功,或者我没有正确实现它
我不知道这是否与tkinter的StringVar()
和.get()
函数的工作有关
我想不出任何其他方法来实施我手头的情况。我愿意接受关于修改代码结构的建议,只要它不是什么重要的东西,并且能够实现我所描述的功能
如果我错过了一些基本的东西,我很抱歉,因为我最近才开始在python中尝试OOP。提前感谢您的帮助。首先,不要使用两个
Tk()
的实例,而是对任何新窗口使用Toplevel。第二:entry有它自己的.get()
函数:entry\u instance.get()
(这让我想到,如果entry甚至有一个textvariable,但它可能有),那么您是否也在代码中使用这个StringVar来处理任何其他内容(像其他小部件一样)另外,在类中定义方法需要self
参数,除非用@staticmethod
修饰,这也可能是问题所在,因此在定义方法时使用def method\u name(self):
它还将帮助访问self。属性。你还得给赛尔夫打电话。使用self.
的方法,如soself.method\u name()
因此,在命令=
kwarg for按钮中,您可以定义命令=self.method\u name
我在init函数和类外的一个函数中使用了StringVar,但这些都是用于单独的tkinter窗口。您是否可以尝试在将名称Var
附加到文件之前打印它,并将self
添加到其他方法(method\u name(self):
)哦,您对其他小部件没有使用相同的StringVar吗?另外,请尝试self.nameentry
,然后访问该bytself.nameentry.get()
,然后查看是否有任何结果