一、具体问题
如图所示,我编写了一个主窗口的程序(如下所示,有兴趣的可以自己复制后运行),发现需要先进入第一个窗口再进入主界面,这不符合逻辑。
代码区域(完整代码):
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() # 启动应用程序的主事件循环
动态演示:
标签:__,tkinter,python,win,self,疑难杂症,height,width,窗口 From: https://www.cnblogs.com/issacnew/p/17434043.html