python-3.x 通过销毁根目录并调用函数重新创建来动态重新启动Tkinter程序时出错

rdlzhqv9  于 2023-01-10  发布在  Python
关注(0)|答案(1)|浏览(119)
import configparser
from tkinter import *
from tkinter import filedialog,messagebox
from tkinter.filedialog import asksaveasfile
from customtkinter import *
import os
import time
import wikipedia
config=configparser.ConfigParser()
config.read("config.ini")
def change_config():
    messagebox.showinfo("Information","App is going to restart in few seconds")
    print(mode.get())
    print(color.get())
    global location
    config.set("THEME","mode",str(mode.get()))
    config.set("VOICE","voice",str(gender.get()))
    if color.get() =="pink":
        location="C:/Users/DELL/Documents/python programs/notepad/custom_theme.json"
        config.set("THEME","color",location)
    else :
        config.set("THEME","color",color.get())
    with open("config.ini","w") as configfile:
        config.write(configfile)
    restart()

def main():
    global root,label,frame1,config_color,config_mode,config_gender
    root=CTk()
    root.geometry("700x600")
    root.resizable(0,0)
    root.title("Notepad")
    frame1=CTkFrame(root,width=150,height=580)
    frame1.pack_propagate(False)
    frame1.place(x=10,y=10)
    config_color=config.get("THEME","color")
    config_mode=config.get("THEME","mode")
    config_gender=config.get("VOICE","voice")
    set_appearance_mode(config_mode)
    set_default_color_theme(config_color)

    label=CTkLabel(root,text="File",width=520,height=40,font=("Algerian",30))
    label.place(x=170,y=10)

    global S
    global text_area
    text_area=CTkTextbox(root,height=580,width=520,) 
    text_area.place(x=170,y=60)

    global button,commands,button_text
    button_text="Settings"
    commands=settings
    button=CTkButton(frame1,text=button_text,command=settings)
        button.pack(padx=10,pady=10)

    root.mainloop()

def settings():
    global submit,mode,color,config_color,config_mode,gender
    window=CTkToplevel(root)
    window.title("Settings")
    window.geometry("200x300")
    label1=CTkLabel(window,text="Mode").pack(pady=5)
    mode=CTkOptionMenu(window,values=["light","dark"])
    mode.pack(pady=5,padx=5,anchor=CENTER) 
    label2=CTkLabel(window,text="Color").pack(pady=5)
    
    color=CTkOptionMenu(window,values=["pink","blue","green","dark-blue"])
    color.pack(pady=5)
    label3=CTkLabel(window,text="speech-gender").pack(pady=5)
    gender=CTkOptionMenu(window,values=["male","female"])
    gender.pack(pady=5)
    submit=CTkButton(window,text="Submit",command=change_config)
    submit.pack(pady=20)
    window.mainloop()

   

if __name__=="__main__":
    def restart():
        time.sleep(5)
        root.destroy()
        main()
        
    main()

我想创建一个记事本,在那里我们可以改变主题和颜色。我做了config.ini文件,我保存当前模式,记事本的颜色和语音类型(语音类型是我在这里添加的文本到语音功能)因为当使用customtkinter时,我们可以设置默认的颜色主题,并且一旦在程序中初始化就不能改变它。程序现在将所选的首选项保存在config中。ini文件并在再次运行时抓取它。我希望程序自己再次运行,而不需要显式地再次运行它。
虽然程序正在运行,我仍然得到这个错误在后端:

invalid command name "2912423726080check_dpi_scaling"
    while executing
"2912423726080check_dpi_scaling"
    ("after" script)
invalid command name "2912423728512update"
    while executing
"2912423728512update"
    ("after" script)
invalid command name "2912423728448<lambda>"
    while executing
"2912423728448<lambda>"
    ("after" script)

我想知道这个错误意味着什么,以便用户可能不会面临问题,在未来使用此应用程序。提前感谢您的帮助。

a9wyjsp7

a9wyjsp71#

您可以尝试执行一些操作来解决此问题。以下是一些建议:
在重新创建根窗口之前,请确保您正在销毁根窗口。这可以使用destroy()方法来完成。

root.destroy()

在销毁根窗口之前,您可能还需要关闭任何其他打开的窗口或小部件。
如果你在代码中使用了全局变量,你应该在重新创建根窗口之前将它们设置为None。这将有助于确保你从一个干净的状态开始。
最后,你可以打电话

root.update()

在销毁根窗口之后和重新创建它之前。这将有助于确保在您尝试重新创建它之前已经完成了对窗口的所有更新。

相关问题