如何将Connectad类中的self.login_field.get()值传递给Query类?
如何将Connectad类中的self.login_field.get()值传递给Query类?
看起来你遇到的是Tkinter多帧切换时跨类传递用户数据的问题对吧?核心问题在于你在Query的adoffice方法里新建了一个Connectad()实例——这个新实例和用户实际输入登录信息的那个完全是两个独立对象,自然拿不到之前的登录值~我给你两个实用的解决方案:
方案一:切换帧时直接传递参数(推荐,灵活可控)
这个方法是在从Connectad切换到Query的时候,把需要的用户信息/AD连接对象直接作为参数传给Query的构造函数,步骤如下:
1. 修正并升级App类的switch_frame方法,支持传递额外参数
class App(Tk): def __init__(self): # 注意你原代码里写的是init,要改成__init__才会生效 Tk.__init__(self) self._frame = None self.switch_frame(Connectad) # 修改switch_frame,支持传递*args和**kwargs给新的帧类 def switch_frame(self, frame_class, *args, **kwargs): new_frame = frame_class(self, *args, **kwargs) if self._frame is not None: self._frame.destroy() self._frame = new_frame self._frame.pack()
2. 在Connectad的connad方法中,切换帧时传入需要的数据
当验证登录成功后,把登录名、AD连接对象这些需要的参数一起传给Query:
elif self.conn.bind(): # 传递登录名和AD连接对象(选你实际需要的) self.parent.switch_frame(Query, user_login=self.AD_USER, ad_conn=self.conn)
3. 修改Query类的__init__方法,接收并保存参数
class Query(Frame): def __init__(self, parent=None, user_login=None, ad_conn=None): Frame.__init__(self, parent) self.parent = parent self.user_login = user_login # 保存登录名到当前实例 self.ad_conn = ad_conn # 保存已建立的AD连接,避免重复创建 def adoffice(self): # 直接使用传递过来的登录值 print(f"当前登录用户:{self.user_login}") # 如果需要操作AD,直接用已绑定的self.ad_conn即可,不用重新连接
方案二:将共享数据存在父类App中(适合多页面共享场景)
如果你的应用后续还有其他页面需要用到用户登录信息,可以把数据存在父类App实例里,所有子页面都能通过self.parent获取:
1. 在Connectad的connad方法中,把数据存入父类App
elif self.conn.bind(): # 把登录信息和AD连接对象存在父类App中 self.parent.user_login = self.AD_USER self.parent.ad_conn = self.conn self.parent.switch_frame(Query)
2. 在Query类中直接从父类获取数据
class Query(Frame): def __init__(self, parent=None): Frame.__init__(self, parent) self.parent = parent def adoffice(self): # 从父类App中直接拿登录信息 user_login = self.parent.user_login print(f"当前登录用户:{user_login}") # 操作AD的话用self.parent.ad_conn
顺便修正你原代码里的几个小问题
- App类的初始化方法是
__init__,不是init,否则不会被调用; - Connectad中
self.notlogon.grid_remove少了括号,应该是self.notlogon.grid_remove(),否则隐藏标签的逻辑不会生效; - 按钮的链式调用问题:
send_button = Button(...).grid(...)会导致send_button的值是None(因为grid方法返回None),如果后续需要操作这个按钮,建议分开写:
send_button = Button(self, text='Отправить',bg='#4a7abc', fg='yellow', activebackground='green', activeforeground='white',command=self.validationlogin) send_button.grid(row=3, column=2, sticky=W, pady=4)
备注:内容来源于stack exchange,提问作者Кирилл Кузнецов
相关产品推荐
相关产品推荐

