Python tkinter点击登录按钮后menu_frame框架不弹出也无报错如何解决
问题原因
- 核心问题:
menu_frame函数中,你仅对框架内部的组件设置了place布局,却没有给menu_frame这个框架本身调用任何布局方法(pack/place/grid),所以框架不会被渲染到窗口上,自然看不到弹出效果。 - 潜在问题1:函数名和内部变量重名,你定义的函数名是
menu_frame,内部创建的Frame变量也叫menu_frame,后续如果需要再次调用该函数会报错"变量不是可调用对象",register_frame函数也存在同样问题。 - 潜在问题2:Entry组件赋值错误,
id_tf = Entry(...).place(...)写法下,place方法返回值为None,所以id_tf实际是None类型,后续调用id_tf.get()会直接抛出异常,正确写法是先创建Entry对象赋值给变量,再单独调用布局方法。
修正方案
1. 修复菜单框架不显示问题
给menu_frame函数末尾添加框架的布局代码即可,示例:
# 尺寸和位置可根据你的设计需求调整 menu_frame.place(x=200, y=100, width=300, height=400)
2. 修正变量名冲突
修改函数名和内部变量名避免重名,比如函数名改为open_menu_frame,内部框架变量改为menu_win,对应修改登录按钮的command参数为open_menu_frame即可。
3. 修正Entry赋值写法
# 错误写法 id_tf = Entry(window,).place(x=330, y=170) # 正确写法 id_tf = Entry(window) id_tf.place(x=330, y=170)
完整可运行修正代码
from tkinter import * window = Tk() window.title("EL TALLO") window.geometry("700x490") window.config(background="#FFF8E5") #회원가입 def open_register_frame(): register_win = Frame( window, bd=2, bg='#FFF8E5', relief=SOLID, padx=10, pady=10 ) Label( register_win, text="ID입력", bg='#CCCCCC', ).grid(row=0, column=0, sticky=W, pady=10) Label( register_win, text="비밀번호 입력", bg='#CCCCCC', ).grid(row=5, column=0, sticky=W, pady=10) newlyset_id = Entry( register_win ) newlyset_pw = Entry( register_win, show='*' ) register_btn = Button( register_win, width=15, text='회원가입', relief=SOLID, cursor='hand2', command=register_win.destroy ) newlyset_id.grid(row=0, column=1, pady=10, padx=20) newlyset_pw.grid(row=5, column=1, pady=10, padx=20) register_btn.grid(row=7, column=1, pady=10, padx=20) register_win.place(x=220, y=150) def new_id(): #new_id에 newlyset_id에 입력한 값을 저장 new_id = newlyset_id.get() def new_pw(): #new_pw에 newlyset_pw에 입력한 값을 저장 new_pw = newlyset_pw.get() #메뉴화면 def open_menu_frame(): menu_win = Frame( window, bd=2, bg='#FFF8E5', relief=SOLID, padx=10, pady=10 ) label1 = Label(menu_win, text = "EL TALLO", bg="lightgreen",width=10, height=1, font=(15)) btn1 = Button(menu_win, text = "play game", bg="gray", width=15, height=1) btn2 = Button(menu_win, text = "How to play", bg="gray", width=15, height=1) btn3 = Button(menu_win, text = "Settings", bg="gray", width=15, height=1) def btncmd(): print("게임이 종료되었습니다") btn4 = Button(menu_win, text = "END GAME", command=btncmd, bg="lightgreen", width=15, height=1) label1.place(x=50, y=50) btn1.place(x=50, y=100) btn2.place(x=50, y=150) btn3.place(x=50, y=200) btn4.place(x=50, y=250) # 新增框架本身的布局设置 menu_win.place(x=200, y=100, width=300, height=400) #로그인 Label( window, text="아이디 입력", bg='#CCCCCC', ).place(x=230, y=170) # 修正Entry赋值写法 id_tf = Entry(window) id_tf.place(x=330, y=170) def get_id(): #id에 id_tf에 입력한 값을 저장 id = id_tf.get() Label( window, text="비밀번호 입력", bg='#CCCCCC', ).place(x=230, y=220) # 修正Entry赋值写法 pw_tf = Entry(window) pw_tf.place(x=330, y=220) def get_pw(): #pw에 pw_tf에 입력한 값을 저장 pw = pw_tf.get() #회원가입 버튼 registerbutton = Button( window, width=15, text="회원가입", bg="#CCCCCC", cursor='hand2', command=open_register_frame ) registerbutton.place(x=360, y=270) #로그인 버튼 loginbutton = Button( window, width=15, text="로그인", bg="#CCCCCC", cursor='hand2', command=open_menu_frame ) loginbutton.place(x=230, y=270) window.mainloop()
内容的提问来源于stack exchange,提问作者박세민
相关产品推荐
相关产品推荐

