Python Tkinter点击按钮新窗口空白 内容覆盖原有Test3窗口如何解决
问题修复方案
问题根源
- 错误1:Tkinter程序全局仅允许存在1个
Tk()主窗口实例,你在main_screen函数中重复创建了新的Tk()实例,会导致控件父容器绑定逻辑混乱 - 错误2:
main_screen中创建的所有Label、Text、Entry、Button控件未显式指定父容器,默认会绑定到程序第一个创建的Tk()实例(也就是Test3主窗口),因此内容全部覆盖到原窗口,新窗口为空 - 错误3:重复调用
mainloop()事件循环,会导致窗口响应逻辑异常
具体修改步骤
- 修改
main_screen函数中的窗口创建逻辑,将screen = Tk()改为screen = Toplevel(root),使用子窗口而非新的主窗口实例 - 为
main_screen内所有控件显式指定父容器为screen,避免默认绑定到主窗口 - 删除
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
相关产品推荐
相关产品推荐

