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

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,提问作者박세민

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 12:54:04