Tkinter 在窗口大小变化时定位窗口

Tkinter 在窗口大小变化时定位窗口,tkinter,position,geometry,python-3.3,Tkinter,Position,Geometry,Python 3.3,我要做的是让我的窗口位于屏幕的右上角。当您浏览不同的选项时,窗口会根据显示的内容更改大小。所以我需要一些东西来检查windows当前的大小,然后根据它的大小来定位它 我的代码: from tkinter import * class Main: def __init__(self, master): self.master = master self.win_1() def win_1(self): for child in s

我要做的是让我的窗口位于屏幕的右上角。当您浏览不同的选项时,窗口会根据显示的内容更改大小。所以我需要一些东西来检查windows当前的大小,然后根据它的大小来定位它

我的代码:

from tkinter import *

class Main:
    def __init__(self, master):
        self.master = master
        self.win_1()

    def win_1(self):
        for child in self.master.winfo_children():
            child.destroy()
        Text(self.master, width = 10, height = 3).grid(columnspan = 2)
        Button(self.master, text = 'Win 2', width = 7, command = self.win_2).grid(row = 2, column = 0)
        Button(self.master, text = 'Exit', width = 7, command = self.master.destroy).grid(row = 2, column = 1)    
        self.position_win()

    def win_2(self):
        for child in self.master.winfo_children():
            child.destroy()
        Text(self.master, width = 20, height = 10).grid()
        Button(self.master, text = 'Win 1', command = self.win_1).grid()
        self.position_win()

    def position_win(self):
        self.h = self.master.winfo_height()
        self.w = self.master.winfo_width()
        self.master.geometry('-%d+%d' % (self.w, self.h))


root = Tk()
Main(root)

root.mainloop()
这是我能想出的实现我目标的最好办法。当我运行此程序时,窗口从右上角的完美位置开始。单击该按钮时,窗口2的右上角将设置为窗口1的左下角。然后,当您单击“返回窗口1”时,它会将右上角设置为与窗口2中相同的位置。从这一点来看,在窗口右上角的窗口之间循环工作,但窗口不在屏幕的右上角。我相信这是很清楚的,但是如果你运行代码,你就会明白我在说什么

它为什么要这样做?我如何修复它


谢谢

您的程序正在执行您告诉它的操作。引用 如果下一部分的格式为+x,则指定窗口的左侧距离桌面左侧x像素。如果下一部分的格式为-x,则窗口的右侧距离桌面右侧x像素

因此,您告诉tk将前一个窗口的宽度放置在远离右边缘的位置。对于垂直位置也是如此。唯一的“神秘”是为什么它第一次出现在角落里。原因是
self.master.geometry()
最初是
1x1+0+0
,不受网格操作的影响。如果希望窗口处于固定位置,请使用
self.master.geometry('-0+0')
将其放置在
\uuuu init\uuuuu
方法中所需的位置,并删除position方法和调用


注意:创建和销毁小部件的另一种方法是创建两个框架,并通过
grid\u忘记
ing一个和
grid
ing另一个进行切换。或者将两者都网格化,然后将您想要的一个提升到顶部。后者使窗口足够大,可以容纳两者。

您的程序正在执行您让它执行的操作。引用 如果下一部分的格式为+x,则指定窗口的左侧距离桌面左侧x像素。如果下一部分的格式为-x,则窗口的右侧距离桌面右侧x像素

因此,您告诉tk将前一个窗口的宽度放置在远离右边缘的位置。对于垂直位置也是如此。唯一的“神秘”是为什么它第一次出现在角落里。原因是
self.master.geometry()
最初是
1x1+0+0
,不受网格操作的影响。如果希望窗口处于固定位置,请使用
self.master.geometry('-0+0')
将其放置在
\uuuu init\uuuuu
方法中所需的位置,并删除position方法和调用


注意:创建和销毁小部件的另一种方法是创建两个框架,并通过
grid\u忘记
ing一个和
grid
ing另一个进行切换。或者将两者都网格化,然后将您想要的一个提升到顶部。后者使窗口足够大,可以同时容纳这两种信息。

好信息。非常感谢。问题解决了。关于你在便笺中的评论,我确实读过这种方法,但以我有限的知识,create/destroy方法更有意义。但我将在下一个项目中研究这种方法。再次感谢!好消息。非常感谢。问题解决了。关于你在便笺中的评论,我确实读过这种方法,但以我有限的知识,create/destroy方法更有意义。但我将在下一个项目中研究这种方法。再次感谢!