疑难杂症(已解决) | 为什么出现python中tkinter创建界面需要一闪而过才进入主窗口?

发布时间 2023-05-26 10:32:39作者: IssacNew

一、具体问题

如图所示,我编写了一个主窗口的程序(如下所示,有兴趣的可以自己复制后运行),发现需要先进入第一个窗口再进入主界面,这不符合逻辑。

 

代码区域(完整代码):

from tkinter import *

class WinGUI(Tk):   
    def __init__(self):
        super().__init__()
        self.__win()
        
    def __win(self):            
        self.title("小软件")
        self.iconbitmap("icon.ico")  # 设置图标

        # 设置窗口大小、居中
        width = 1024
        height = 450
        screenwidth = self.winfo_screenwidth()
        screenheight = self.winfo_screenheight()
        geometry = '%dx%d+%d+%d' % (width, height, (screenwidth - width) / 2, (screenheight - height) / 2)
        self.geometry(geometry)
        self.resizable(width=False, height=False)       


if __name__ == "__main__":
    win = WinGUI()   # 创建Win对象   
    win.mainloop()   # 启动应用程序的主事件循环

 

二、解决方案

尝试思路,由于我的代码量到达1000行+,开始以为是实例化了多个窗口导致,摸索了一个小时才发现,网上没有答案,问题确实比较隐蔽。经过排查,其实问题很简单,思路是应该先要设置窗口位置,再设置窗口名称、图标。

问题发生原因:下面这2行代码会事先使用系统默认的窗口生成位置(左上角某个位置)去创建窗口名称,图标。

    def __win(self):            
        self.title("小软件")
        self.iconbitmap("icon.ico")  # 设置图标

 

这样一来,解决方法自然很简单了,我把这【创建图标、窗口名称的2行代码】放到【创建位置的代码】之后就好了。

正确代码(完整代码)如下:

from tkinter import *

class WinGUI(Tk):   
    def __init__(self):
        super().__init__()
        self.__win()
        
    def __win(self):
        # 设置窗口大小、居中
        width = 1024
        height = 450
        screenwidth = self.winfo_screenwidth()
        screenheight = self.winfo_screenheight()
        geometry = '%dx%d+%d+%d' % (width, height, (screenwidth - width) / 2, (screenheight - height) / 2)
        self.geometry(geometry)
        self.resizable(width=False, height=False)     

        self.title("小软件")
        self.iconbitmap("icon.ico")  # 设置图标  


if __name__ == "__main__":
    win = WinGUI()   # 创建Win对象   
    win.mainloop()   # 启动应用程序的主事件循环

 

动态演示: