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

时间:2016-02-07 18:41:34

标签: tkinter position geometry python-3.3

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

我的代码:

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中相同的位置。从这一点来看,窗口之间的循环工作在窗口的右上角,但窗口不在屏幕的右上角。我确信这很清楚,但如果你运行代码,你会看到我在说什么。

为什么要这样做以及如何解决?

谢谢!

1 个答案:

答案 0 :(得分:0)

您的程序正在按照您的要求执行操作。引自http://infohost.nmt.edu/tcc/help/pubs/tkinter/web/geometry.html "如果下一部分的格式为+ x,则指定窗口的左侧应该是桌面左侧的x像素。如果它具有-x形式,则窗口的右侧距离桌面右侧x个像素。 "

所以你要告诉tk将窗口的宽度放在远离右边缘的前一个窗口。同样对于垂直位置。唯一的谜团'这就是为什么它第一次出现在角落里。原因是self.master.geometry()最初是1x1+0+0,并且不受网格操作的影响。如果您希望窗口位于一个固定的位置,请使用__init__self.master.geometry('-0+0')方法放在所需的位置,然后删除位置方法并调用。

注意:创建和销毁小部件的另一种方法是创建两个帧,然后按grid_forget切换一个,grid切换另一个。或网格两个并提升您想要的顶部。后者使窗口大到足以容纳两者。