You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将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

顺便修正你原代码里的几个小问题

  1. App类的初始化方法是__init__,不是init,否则不会被调用;
  2. Connectad中self.notlogon.grid_remove少了括号,应该是self.notlogon.grid_remove(),否则隐藏标签的逻辑不会生效;
  3. 按钮的链式调用问题: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,提问作者Кирилл Кузнецов

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.21 08:10:27