在 window 大小发生变化时定位它
Positioning a window as it changes in size
我想做的是让 window 位于屏幕的右上角。当您浏览不同的选项时,window 会根据显示的内容更改大小。所以我需要一些东西来检查 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()
这是我为实现目标所能想出的最好办法。当我 运行 这个时, window 开始完美地位于右上角。单击该按钮时,window 2 的右上角设置为 window 1 的左下角。然后当您单击返回 window 1 时,它设置右上角角到与 window 中相同的位置 2. 从这一点开始,windows 之间的循环在 window 的右上角起作用,但 windows 是不在屏幕的右上角。我敢肯定这很清楚,但是如果你 运行 代码你就会明白我在说什么。
为什么会这样,我该如何解决?
谢谢!
你的程序正在做你告诉它做的事情。引用自 http://infohost.nmt.edu/tcc/help/pubs/tkinter/web/geometry.html
"If the next part has the form +x, it specifies that the left side of the window should be x pixels from the left side of the desktop. If it has the form -x, the right side of the window is x pixels from the right side of the desktop. "
所以你是在告诉 tk 把 window 前一个 window 的宽度远离右边缘。垂直位置也是如此。唯一的'mystery'就是为什么第一次在角落里。原因是 self.master.geometry()
最初是 1x1+0+0
并且不受网格操作的影响。如果你想要 window 在一个不变的地方,把它放在你想要的 __init__
方法中 self.master.geometry('-0+0')
并删除位置方法和调用。
注意:创建和销毁小部件的另一种方法是创建两个框架,然后通过 grid_forget
ing 一个和 grid
ing 另一个进行切换。或者把两者都网格化,然后把你想要的放在上面。后者使 window 足够容纳两者。
我想做的是让 window 位于屏幕的右上角。当您浏览不同的选项时,window 会根据显示的内容更改大小。所以我需要一些东西来检查 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()
这是我为实现目标所能想出的最好办法。当我 运行 这个时, window 开始完美地位于右上角。单击该按钮时,window 2 的右上角设置为 window 1 的左下角。然后当您单击返回 window 1 时,它设置右上角角到与 window 中相同的位置 2. 从这一点开始,windows 之间的循环在 window 的右上角起作用,但 windows 是不在屏幕的右上角。我敢肯定这很清楚,但是如果你 运行 代码你就会明白我在说什么。
为什么会这样,我该如何解决?
谢谢!
你的程序正在做你告诉它做的事情。引用自 http://infohost.nmt.edu/tcc/help/pubs/tkinter/web/geometry.html "If the next part has the form +x, it specifies that the left side of the window should be x pixels from the left side of the desktop. If it has the form -x, the right side of the window is x pixels from the right side of the desktop. "
所以你是在告诉 tk 把 window 前一个 window 的宽度远离右边缘。垂直位置也是如此。唯一的'mystery'就是为什么第一次在角落里。原因是 self.master.geometry()
最初是 1x1+0+0
并且不受网格操作的影响。如果你想要 window 在一个不变的地方,把它放在你想要的 __init__
方法中 self.master.geometry('-0+0')
并删除位置方法和调用。
注意:创建和销毁小部件的另一种方法是创建两个框架,然后通过 grid_forget
ing 一个和 grid
ing 另一个进行切换。或者把两者都网格化,然后把你想要的放在上面。后者使 window 足够容纳两者。