一、具体问题
如图所示,我编写了一个主窗口的程序(如下所示,有兴趣的可以自己复制后运行),发现需要先进入第一个窗口再进入主界面,这不符合逻辑。
![]()
代码区域(完整代码):
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() # 启动应用程序的主事件循环
动态演示:
![]()