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

如何在CustomTkinter登录系统中访问并修改lbl_message文本?

如何在CustomTkinter登录系统中修改登录提示文本?

核心问题在于:lbl_message是LoginFrame类__init__方法内的局部变量,并非类的实例属性;同时Window类里的LoginFrame实例也未被保存为窗口对象的属性,导致无法跨类访问并修改该标签文本。

解决步骤:

  1. 将lbl_message转为LoginFrame实例属性:在LoginFrame的__init__中,把lbl_message = ctk.CTkLabel(...)改为self.lbl_message = ctk.CTkLabel(...),让每个LoginFrame实例都拥有该属性。
  2. 保存LoginFrame实例到Window对象:在Window的__init__里,将LoginFrame = LoginFrame(self)改为self.login_frame = LoginFrame(self),确保窗口能直接访问登录框架实例。
  3. 在check_login方法中更新文本:通过self.login_frame.lbl_message访问标签,调用config()方法或直接设置text属性修改提示内容。

修改后的完整代码:

import customtkinter as ctk

class Window(ctk.CTk):
    def __init__(self):
        super().__init__()
        self.attributes("-fullscreen", True)
        self.resizable(False, False)
        self.columnconfigure(0, weight=1)
        self.rowconfigure(0, weight=1)
        # 保存登录框架实例为窗口属性
        self.login_frame = LoginFrame(self)
        self.login_frame.grid(row=0, column=0, sticky="nsew")  # 让框架填充窗口

    def check_login(self, u, p):
        if u == "user" and p == "bhjs":
            self.login_frame.lbl_message.config(text="login as user")
        elif u == "admin" and p == "pass":
            self.login_frame.lbl_message.config(text="login as admin")
        else:
            self.login_frame.lbl_message.config(text="login failed")

class LoginFrame(ctk.CTkFrame):
    def __init__(self, master):
        super().__init__(master)

        self.columnconfigure(0, weight=1)
        self.columnconfigure(1, weight=1)

        lbl_welcome = ctk.CTkLabel(self, text="Welcome. Please Login.")
        lbl_welcome.grid(column=0, row=0, columnspan=2, pady=10)
        lbl_username = ctk.CTkLabel(self, text="username:")
        lbl_username.grid(column=0, row=1, sticky="E")
        lbl_password = ctk.CTkLabel(self, text="password:")
        lbl_password.grid(column=0, row=2, sticky="E")
        ent_username = ctk.CTkEntry(self, placeholder_text="username", placeholder_text_color="gray")
        ent_username.grid(column=1, row=1, padx=12, pady=10, sticky="W")
        ent_password = ctk.CTkEntry(self, placeholder_text="password", placeholder_text_color="gray", show="*")
        ent_password.grid(column=1, row=2, padx=12, pady=10, sticky="W")
        btn_login = ctk.CTkButton(self, text="login", cursor="hand2", command=lambda: master.check_login(ent_username.get(), ent_password.get()))
        btn_login.grid(column=0, row=3, columnspan=2, pady=10)
        # 将标签设为实例属性
        self.lbl_message = ctk.CTkLabel(self, text="")
        self.lbl_message.grid(column=0, row=4, columnspan=2, pady=10)

if __name__ == "__main__":
    app = Window()
    app.mainloop()

注:补充了self.login_frame.grid(...),否则登录框架不会显示在窗口中,这是原代码的遗漏点。

内容的提问来源于stack exchange,提问作者hky

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 15:22:47