Python Customtkinter创建用户页面报错:缺少Pin和CPin参数
第一次用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()
问题分析与修正
核心问题
- 调用方式错误:
Create_User是继承自CTk的窗口类,应该先实例化对象,而非直接通过类调用UserB方法;且UserB要求传入Pin和CPin参数,调用时未提供。 - 变量初始化错误:
customtkinter.IntVar()不需要传入Pin.get()作为参数,应先创建变量再关联到输入框。 - 密码比较逻辑错误:直接比较
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

