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

Python Tkinter点击按钮新窗口空白 内容覆盖原有Test3窗口如何解决

问题修复方案

问题根源

  • 错误1:Tkinter程序全局仅允许存在1个Tk()主窗口实例,你在main_screen函数中重复创建了新的Tk()实例,会导致控件父容器绑定逻辑混乱
  • 错误2:main_screen中创建的所有Label、Text、Entry、Button控件未显式指定父容器,默认会绑定到程序第一个创建的Tk()实例(也就是Test3主窗口),因此内容全部覆盖到原窗口,新窗口为空
  • 错误3:重复调用mainloop()事件循环,会导致窗口响应逻辑异常

具体修改步骤

  1. 修改main_screen函数中的窗口创建逻辑,将screen = Tk()改为screen = Toplevel(root),使用子窗口而非新的主窗口实例
  2. 为main_screen内所有控件显式指定父容器为screen,避免默认绑定到主窗口
  3. 删除screen.mainloop()行,无需重复启动事件循环,原有root.mainloop()已覆盖所有子窗口

修复后完整代码

from tkinter import *
from tkinter import messagebox
import base64

root = Tk()
root.title("Test3")

mylabel0= Label(root, text="—————→")
mylabel0.grid(row=0, column=0)
mylabel1= Label(root, text="Test3", font=500)
mylabel1.config(font=("segoe ui black", 20))
mylabel1.grid(row=0, column=1)
mylabel0= Label(root, text="←—————")
mylabel0.grid(row=0, column=2)

def hider():
    def decrypt():
        password = code.get()
        if password == "2929":
            screen2 = Toplevel(screen)
            screen2.title("decryption")
            screen2.geometry("400x200")
            screen2.configure(bg="#00bd56")

            message = text1.get(1.0, END)
            decode_message = message.encode("ascii")
            base64_bytes = base64.b64decode(decode_message)
            decrypt_res = base64_bytes.decode("ascii")

            Label(screen2, text="DECRYPT", font="arial", fg="white", bg="#00bd56").place(x=10, y=0)
            text2 = Text(screen2, font="Roboto 10", bg="white", relief=GROOVE, wrap=WORD, bd=0)
            text2.place(x=10, y=40, width=380, height=150)

            text2.insert(END, decrypt_res)
        elif password == "":
            messagebox.showerror("encryption", "Password section is Empty")
        else:
            messagebox.showerror("encryption", "Invalid Password")

    def encrypt():
        password = code.get()
        if password == "2929":
            screen1 = Toplevel(screen)
            screen1.title("encryption")
            screen1.geometry("400x200")
            screen1.configure(bg="#ed3833")

            message = text1.get(1.0, END)
            encode_message = message.encode("ascii")
            base64_bytes = base64.b64encode(encode_message)
            encrypt_res = base64_bytes.decode("ascii")

            Label(screen1, text="ENCRYPT", font="arial", fg="white", bg="#ed3833").place(x=10, y=0)
            text2 = Text(screen1, font="Roboto 10", bg="white", relief=GROOVE, wrap=WORD, bd=0)
            text2.place(x=10, y=40, width=380, height=150)

            text2.insert(END, encrypt_res)
        elif password == "":
            messagebox.showerror("encryption", "Password section is Empty")
        else:
            messagebox.showerror("encryption", "Invalid Password")

    def main_screen():
        global screen
        global code
        global text1
        # 改为创建子窗口而非新的主窗口
        screen = Toplevel(root)
        screen.geometry("400x500")
        screen.title("msg hider")

        def reset():
            code.set("")
            text1.delete(1.0, END)

        # 所有控件显式指定父容器为screen
        Label(master=screen, text="Enter text for encryption and decryption:", fg="black", font=("segoe ui black", 13)).place(x=10,y=10)
        text1 = Text(master=screen, font="Roboto 20", bg="white", fg="black", relief=GROOVE, wrap=WORD, bd=0)
        text1.place(x=10, y=50, width=355, height=100)

        Label(master=screen, text="Enter secret key for encryption and decryption:", fg="black", font=("segoe ui semibold", 13)).place(x=10, y=170)

        code = StringVar()
        Entry(master=screen, textvariable=code, width=19, bd=0, font=("arial", 25), show="•").place(x=10, y=200)

        Button(master=screen, text="ENCRYPT", height="2", width=23, bg="black", fg="white", bd=0, command=encrypt).place(x=10, y=250)
        Button(master=screen, text="DECRYPT", height="2", width="23", bg="black", fg="white", bd=0, command=decrypt).place(x=200,y=250)
        Button(master=screen, text="RESET", height="2", width="50", bg="#ed3833", fg="white", bd=0, command=reset).place(x=10, y=300)

    main_screen()

button_ebook= Button(root, text="Msg Hider🔐", font=30, padx=25, pady=25, command=hider, fg="black", bg="white", borderwidth=1)
button_ebook.grid(row=3, column=2, padx=10)

root.mainloop()

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 06:54:03