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

如何在CustomTkinter的其他Frame类中使用tkraise?解决TypeError

问题分析与解决方法

错误原因

  1. 嵌套函数的self参数错误:你把sign_in定义为widgets方法里的嵌套函数,却给它加了self参数。按钮点击时不会自动传递self给这个函数,触发时就会报缺少self参数的错误。而且嵌套函数不属于类方法,不需要self参数,就算去掉也没法方便地访问类的属性和外部的Main框架。
  2. 无法访问Main框架:Main是software类里的局部变量,login_page没有合法的引用路径,所以没法直接调用self.Main.tkraise()。

解决步骤

1. 让software类的核心组件成为实例属性

把Main和Login_page改成software的实例属性,这样login_page可以通过父组件(self.master)访问到Main:

class software(CTk):
    def __init__(self):
        super().__init__()
        self.geometry('1000x800')

        # 将核心组件改为实例属性,方便子组件跨类访问
        self.Main = main(self)
        self.Login_page = login_page(self)
        
        Menu = menu(self.Main)
        Keypad = keypad(self.Main)
        Sub_menu = sub_menu(self.Main)
        Header = header(self.Main)
        Right_menu = right_menu(self.Main)
        Admin_menu = admin_menu(self.Main)
        self.mainloop()

2. 重构login_page类

  • 把sign_in从嵌套函数改成类的方法,类方法自带self参数,无需额外定义。
  • 将输入框改为实例属性,让sign_in能通过self访问输入内容。
  • 按钮的command直接绑定类的sign_in方法。
  • 通过self.master.Main获取主框架,调用tkraise()切换显示。

修改后的login_page类:

class login_page(CTkFrame):
    def __init__(self,parent):
        super().__init__(parent)
        self.configure(width=1000,height=800,fg_color='black')
        self.place(x=0,y=0)

        # 定义为实例属性,方便sign_in方法访问
        self.login_entryfield = CTkEntry(self, width=200)    
        self.password_entryfield = CTkEntry(self, width=200) 

        self.widgets()

    def widgets(self):
        login_label = CTkLabel(self,text='Login',font = ("Arial", 20, "bold"))
        password_label = CTkLabel(self,text='Password',font = ("Arial", 20, "bold"))
        # 绑定类的sign_in方法
        enter_button  = CTkButton(self,text='Login',font = ("Arial", 20, "bold"),command=self.sign_in)

        # 布局
        login_label.place(x=300,y=100)
        self.login_entryfield.place(x=400,y=100)
        password_label.place(x=300,y=200)
        self.password_entryfield.place(x=400,y=200)
        enter_button.place(x=400,y=700)

    def sign_in(self):
        if self.login_entryfield.get() == 'user123':
            if self.password_entryfield.get() == 'base12':
                print('signed in as user')
                # 通过master访问software实例的Main框架,切换显示层级
                self.master.Main.tkraise()
            else:
                print('incorrect password')
        else:
            print('incorrect user name')

3. 可选优化建议

  • 全局变量d_text可以改成keypad类的实例属性,避免全局变量带来的潜在冲突。
  • 组件类名建议采用大驼峰命名法(比如login_page改成LoginPage,main改成MainFrame),符合Python代码规范。

修改后的代码可以正常运行,登录成功后会自动切换显示主框架。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 01:37:03