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

Python Customtkinter创建用户页面报错:缺少Pin和CPin参数

问题:创建用户页面时出现TypeError缺失参数错误

第一次用Python开发学校项目的App用户创建页面,遇到报错。查过视频、网页资料,买了Eric Matthes的Python闪卡仍无法解决。报错信息显示TypeError: Create_User.UserB() missing 2 required positional arguments: 'Pin' and 'CPin',以下是相关代码,请求指出问题并修正。

报错信息

C:\Users\Vatech\PycharmProjects\Guardian-app\venv\Scripts\python.exe
C:\Users\Vatech\PycharmProjects\Guardian-app\main.py Exception in
Tkinter callback Traceback (most recent call last): File
"C:\Users\Vatech\AppData\Local\Programs\Python\Python311\Lib\tkinter_init_.py",
line 1948, in call
return self.func(*args)
^^^^^^^^^^^^^^^^ File "C:\Users\Vatech\PycharmProjects\Guardian-app\venv\Lib\site-packages\customtkinter\windows\widgets\ctk_button.py",
line 553, in _clicked
self._command() File "C:\Users\Vatech\PycharmProjects\Guardian-app\main.py", line 53, in
CUID_button_event2
Create_User.UserB(self) TypeError: Create_User.UserB() missing 2 required positional arguments: 'Pin' and 'CPin'

Create_User类代码

import customtkinter
import tkinter

class Create_User(customtkinter.CTk):
    def __init__(self,*args):
       pass
    def UserB(self,Pin,CPin):

        self.Pin = customtkinter.IntVar(Pin.get())
        self.CPin = customtkinter.IntVar(CPin.get())


        self.Middle_frame = customtkinter.CTkFrame(self, width=850, height=500, corner_radius=10)
        self.Middle_frame.place(relx=0.585, rely=0.45, anchor=tkinter.CENTER)

        self.Create_User_label = customtkinter.CTkLabel(self.Middle_frame, text="Create Account", anchor="w",font=customtkinter.CTkFont(size=30, weight="bold"))
        self.Create_User_label.place(relx=0.5, rely=0.2, anchor=tkinter.CENTER)

        self.Username_entry = customtkinter.CTkEntry(self.Middle_frame, width=250, height=25, corner_radius=10,placeholder_text="Username")
        self.Username_entry.place(relx=0.5, rely=0.3, anchor=tkinter.CENTER)
        self.Pin_entry = customtkinter.CTkEntry(self.Middle_frame, width=250, height=25, corner_radius=10,placeholder_text="4 digit Pin",textvariable=Pin)
        self.Pin_entry.place(relx=0.5, rely=0.4, anchor=tkinter.CENTER)
        self.CPin_entry = customtkinter.CTkEntry(self.Middle_frame, width=250, height=25, corner_radius=10,placeholder_text="Confirm Pin", textvariable=CPin)
        self.CPin_entry.place(relx=0.5, rely=0.5, anchor=tkinter.CENTER)
        self.Create_Account_Button = customtkinter.CTkButton(self.Middle_frame, text="Create Account",command=self.PinChecking_Event)
        self.Create_Account_Button.place(relx=0.5, rely=0.6, anchor=tkinter.CENTER)

    def PinChecking_Event(self):
        if self.CPin != self.Pin:
            self.Doesnotmatch_label = customtkinter.CTkLabel(self.Middle_frame, text="Pins do not match")
            self.Doesnotmatch.place(relx=0.5, rely=0.6, anchor=tkinter.CENTER)

        elif self.CPin == self.Pin:
            breakpoint()

主类App代码

from Backupbutton import Backupbutton
from Help_Button import Help_Button
from Create_User import Create_User
import customtkinter
import tkinter

customtkinter.set_appearance_mode("Dark")
customtkinter.set_default_color_theme("green")

class App(customtkinter.CTk):
    def __init__(self):
        super().__init__()
        #logo, title and window size
        self.title("Guardian")
        self.geometry("1100x580")
        self.iconbitmap("App-logo.ICO")

        #Main grid
        self.grid_columnconfigure(1, weight=1)
        self.grid_columnconfigure((2, 3), weight=0)
        self.grid_rowconfigure((0, 1, 2), weight=1)

        self.App_Name_label = customtkinter.CTkLabel(self, text="Guardian", font=customtkinter.CTkFont(size=45, weight="bold"))
        self.App_Name_label.grid(row=3, column=3, padx=20, pady=(20, 10))

#Side Menu
        self.sidebar_frame = customtkinter.CTkFrame(self, width=140, corner_radius=0)
        self.sidebar_frame.grid(row=0, column=0, rowspan=4, sticky="nsew")
        self.sidebar_frame.grid_rowconfigure(4, weight=1)
#Side Menu label
        self.logo_label = customtkinter.CTkLabel(self.sidebar_frame, text="Menu", font=customtkinter.CTkFont(size=20, weight="bold"))
        self.logo_label.grid(row=0, column=0, padx=20, pady=(20, 10))
#Side Menu buttons
        self.sidebar_button_1 = customtkinter.CTkButton(self.sidebar_frame, text="Backup", command=self.Backup_button_event1)
        self.sidebar_button_1.grid(row=1, column=0, padx=20, pady=10)
        self.sidebar_button_2 = customtkinter.CTkButton(self.sidebar_frame, text="Create User ID", command=self.CUID_button_event2)
        self.sidebar_button_2.grid(row=2, column=0, padx=20, pady=10)
        self.sidebar_button_2 = customtkinter.CTkButton(self.sidebar_frame, text="Help", command=self.Help_button_event3)
        self.sidebar_button_2.grid(row=3, column=0, padx=20, pady=10)
#Side Menu OptionMenu's
        self.appearance_mode_label = customtkinter.CTkLabel(self.sidebar_frame, text="Appearance Mode:", anchor="w")
        self.appearance_mode_label.place(relx=0.5, rely=0.85, anchor=tkinter.CENTER)
        self.appearance_mode_optionemenu = customtkinter.CTkOptionMenu(self.sidebar_frame,values=["Dark", "Light"], command=self.change_appearance_mode_event)
        self.appearance_mode_optionemenu.place(relx=0.5, rely=0.90, anchor=tkinter.CENTER)


    def change_appearance_mode_event(self, new_appearance_mode: str):
        customtkinter.set_appearance_mode(new_appearance_mode)
    def Backup_button_event1(self):
        Backupbutton.BackupB(self)
    def CUID_button_event2(self):
        Create_User.UserB(self)
    def Help_button_event3(self):
        Help_Button.helpB(self)


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

问题分析与修正

核心问题

  1. 调用方式错误:Create_User是继承自CTk的窗口类,应该先实例化对象,而非直接通过类调用UserB方法;且UserB要求传入Pin和CPin参数,调用时未提供。
  2. 变量初始化错误:customtkinter.IntVar()不需要传入Pin.get()作为参数,应先创建变量再关联到输入框。
  3. 密码比较逻辑错误:直接比较IntVar对象而非其存储的值,且提示标签的变量名调用错误。

修正后的代码

修正后的Create_User类

import customtkinter
import tkinter

class Create_User(customtkinter.CTk):
    def __init__(self, parent):
        super().__init__()
        self.parent = parent
        self.setup_ui()

    def setup_ui(self):
        # 创建存储输入值的变量
        self.Pin = customtkinter.IntVar()
        self.CPin = customtkinter.IntVar()

        self.Middle_frame = customtkinter.CTkFrame(self, width=850, height=500, corner_radius=10)
        self.Middle_frame.place(relx=0.585, rely=0.45, anchor=tkinter.CENTER)

        self.Create_User_label = customtkinter.CTkLabel(self.Middle_frame, text="Create Account", anchor="w",font=customtkinter.CTkFont(size=30, weight="bold"))
        self.Create_User_label.place(relx=0.5, rely=0.2, anchor=tkinter.CENTER)

        self.Username_entry = customtkinter.CTkEntry(self.Middle_frame, width=250, height=25, corner_radius=10,placeholder_text="Username")
        self.Username_entry.place(relx=0.5, rely=0.3, anchor=tkinter.CENTER)
        # 添加show="*"隐藏输入的密码
        self.Pin_entry = customtkinter.CTkEntry(self.Middle_frame, width=250, height=25, corner_radius=10,placeholder_text="4 digit Pin", textvariable=self.Pin, show="*")
        self.Pin_entry.place(relx=0.5, rely=0.4, anchor=tkinter.CENTER)
        self.CPin_entry = customtkinter.CTkEntry(self.Middle_frame, width=250, height=25, corner_radius=10,placeholder_text="Confirm Pin", textvariable=self.CPin, show="*")
        self.CPin_entry.place(relx=0.5, rely=0.5, anchor=tkinter.CENTER)
        self.Create_Account_Button = customtkinter.CTkButton(self.Middle_frame, text="Create Account",command=self.PinChecking_Event)
        self.Create_Account_Button.place(relx=0.5, rely=0.6, anchor=tkinter.CENTER)

    def PinChecking_Event(self):
        try:
            # 获取变量存储的实际值
            pin_value = self.Pin.get()
            cpin_value = self.CPin.get()
            if pin_value != cpin_value:
                # 移除之前的提示标签(如果存在)
                if hasattr(self, 'Doesnotmatch_label'):
                    self.Doesnotmatch_label.destroy()
                self.Doesnotmatch_label = customtkinter.CTkLabel(self.Middle_frame, text="Pins do not match", text_color="red")
                self.Doesnotmatch_label.place(relx=0.5, rely=0.7, anchor=tkinter.CENTER)
            else:
                # 移除之前的提示标签(如果存在)
                if hasattr(self, 'Doesnotmatch_label'):
                    self.Doesnotmatch_label.destroy()
                print("Pins match! Creating user...")
                # 这里可添加保存用户信息的逻辑
                self.destroy()  # 匹配成功后关闭窗口
        except tkinter.TclError:
            # 处理非数字输入的情况
            if hasattr(self, 'Doesnotmatch_label'):
                self.Doesnotmatch_label.destroy()
            self.Doesnotmatch_label = customtkinter.CTkLabel(self.Middle_frame, text="Please enter a 4-digit number", text_color="red")
            self.Doesnotmatch_label.place(relx=0.5, rely=0.7, anchor=tkinter.CENTER)

修正后的主类中CUID_button_event2方法

def CUID_button_event2(self):
        # 实例化Create_User窗口
        self.create_user_window = Create_User(self)
        self.create_user_window.title("Create User")
        self.create_user_window.geometry("900x550")
        self.create_user_window.mainloop()

修正说明

  • 重构Create_User类的初始化逻辑,将UI创建移到setup_ui方法,符合窗口类的设计规范,无需外部传参。
  • 在类内部创建IntVar变量并关联到输入框,避免参数传递问题。
  • 修复密码比较逻辑,改为比较变量的实际值,添加输入错误处理,并修正标签变量名的调用错误。
  • 主类中通过实例化Create_User对象打开新窗口,而非直接调用类方法。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 11:37:08