将顶级 window(s) 锚定到根 window、python 2.7 - windows 7
Anchoring Toplevel window(s) to root window, python 2.7 - windows 7
我有自己喜欢的布局,但是当我移动根 window 时,我希望顶层 windows 与根 window 一起移动。这可能吗?我也喜欢这样的想法,即用户可以选择从根 window 移动一个或所有 TopLevel windows。
如果不可能,是否有其他类似的选项?
from Tkinter import *
import sys
def main():
root = Tk()
root.title('skyreach')
root.geometry('1900x1000+0+0')
root.lower()
board = Toplevel(root)
board.geometry('1875x200+10+30')
board.title('Tasked')
board1 = Toplevel(root)
board1.geometry('1875x200+10+270')
board1.title('Sched and Confirm')
board2 = Toplevel(root)
board2.geometry('1875x200+10+510')
board2.title('Sched')
board3 = Toplevel(root)
board3.geometry('1875x200+10+750')
board3.title('Completed')
frame = Frame(root, relief = RAISED, borderwidth = 10)
frame.pack(fill = BOTH, expand = 1)
frame = Frame(board, relief = RAISED, borderwidth = 10)
frame.pack(side = BOTTOM, fill = BOTH, expand = 1)
frame = Frame(board1, relief = RAISED, borderwidth = 10)
frame.pack(side = BOTTOM, fill = BOTH, expand = 1)
frame = Frame(board2, relief = RAISED, borderwidth = 10)
frame.pack(side = BOTTOM, fill = BOTH, expand = 1)
frame = Frame(board3, relief = RAISED, borderwidth = 10)
frame.pack(side = BOTTOM, fill = BOTH, expand = 1)
export = Button(root, text = 'Export to CSV', width = 20)
export.pack(side = LEFT)
refresh = Button(root, text = 'Refresh', width = 20)
refresh.pack(side = LEFT)
exitbut = Button(root, text = 'Exit', width = 20, command = sys.exit)
exitbut.pack(side = LEFT)
root.mainloop()
if __name__== "__main__":
main()
可以使用Toplevel的"transient"方法来定义每个window的关系。我做了一些修改并确认现在如果您移动根 window,所有 Toplevel windows 都会跟随它。
代码:
从 Tkinter 导入 *
导入系统
def main():
root = Tk()
root.title('skyreach')
root.geometry('1900x1000+0+0')
root.lower()
board = Toplevel(root)
board.transient(root)
board.geometry('1875x200+10+30')
board.title('Tasked')
board1 = Toplevel(root)
board1.transient(root)
board1.geometry('1875x200+10+270')
board1.title('Sched and Confirm')
board2 = Toplevel(root)
board2.transient(root)
board2.geometry('1875x200+10+510')
board2.title('Sched')
board3 = Toplevel(root)
board3.transient(root)
board3.geometry('1875x200+10+750')
board3.title('Completed')
frame = Frame(root, relief = RAISED, borderwidth = 10)
frame.pack(fill = BOTH, expand = 1)
frame = Frame(board, relief = RAISED, borderwidth = 10)
frame.pack(side = BOTTOM, fill = BOTH, expand = 1)
frame = Frame(board1, relief = RAISED, borderwidth = 10)
frame.pack(side = BOTTOM, fill = BOTH, expand = 1)
frame = Frame(board2, relief = RAISED, borderwidth = 10)
frame.pack(side = BOTTOM, fill = BOTH, expand = 1)
frame = Frame(board3, relief = RAISED, borderwidth = 10)
frame.pack(side = BOTTOM, fill = BOTH, expand = 1)
export = Button(root, text = 'Export to CSV', width = 20)
export.pack(side = LEFT)
refresh = Button(root, text = 'Refresh', width = 20)
refresh.pack(side = LEFT)
exitbut = Button(root, text = 'Exit', width = 20, command = sys.exit)
exitbut.pack(side = LEFT)
root.mainloop()
if __name__== "__main__":
main()
在 Windows 7 上,<Configure>
事件在拖动 window 以及调整其大小时触发。您可以使用此事件在移动根 window 时移动 Toplevel window。
示例:
from Tkinter import *
class App():
def __init__(self):
self.root = Tk()
self.root.geometry('300x300+100+100')
self.root.bind('<Configure>', self.root_conf)
self.top = []
self.top.append(Toplevel(self.root))
self.top[0].geometry('200x200+150+150')
self.top[0].transient(self.root)
self.x_off = []
self.y_off = []
self.x_off.append(50)
self.y_off.append(50)
self.top[0].bind('<Configure>', lambda e: self.top_conf(e, 0))
self.top.append(Toplevel(self.root))
self.top[1].geometry('200x200+450+150')
self.top[1].transient(self.root)
self.x_off.append(350)
self.y_off.append(50)
self.top[1].bind('<Configure>', lambda e: self.top_conf(e, 1))
self.root.mainloop()
def root_conf(self, e):
self.top[0].geometry('{}x{}+{}+{}'.format(self.top[0].winfo_width(), self.top[0].winfo_height(), e.x+self.x_off[0], e.y+self.y_off[0]))
self.top[1].geometry('{}x{}+{}+{}'.format(self.top[1].winfo_width(), self.top[1].winfo_height(), e.x+self.x_off[1], e.y+self.y_off[1]))
def top_conf(self, e, num):
self.x_off[num] = e.widget.winfo_x()-self.root.winfo_x()
self.y_off[num] = e.widget.winfo_y()-self.root.winfo_y()
if __name__== "__main__":
App()
请注意,根据@7stud 的评论,这在 MacOSX 上不起作用,因为拖动 window 时不会触发 <Configure>
事件。
我有自己喜欢的布局,但是当我移动根 window 时,我希望顶层 windows 与根 window 一起移动。这可能吗?我也喜欢这样的想法,即用户可以选择从根 window 移动一个或所有 TopLevel windows。
如果不可能,是否有其他类似的选项?
from Tkinter import *
import sys
def main():
root = Tk()
root.title('skyreach')
root.geometry('1900x1000+0+0')
root.lower()
board = Toplevel(root)
board.geometry('1875x200+10+30')
board.title('Tasked')
board1 = Toplevel(root)
board1.geometry('1875x200+10+270')
board1.title('Sched and Confirm')
board2 = Toplevel(root)
board2.geometry('1875x200+10+510')
board2.title('Sched')
board3 = Toplevel(root)
board3.geometry('1875x200+10+750')
board3.title('Completed')
frame = Frame(root, relief = RAISED, borderwidth = 10)
frame.pack(fill = BOTH, expand = 1)
frame = Frame(board, relief = RAISED, borderwidth = 10)
frame.pack(side = BOTTOM, fill = BOTH, expand = 1)
frame = Frame(board1, relief = RAISED, borderwidth = 10)
frame.pack(side = BOTTOM, fill = BOTH, expand = 1)
frame = Frame(board2, relief = RAISED, borderwidth = 10)
frame.pack(side = BOTTOM, fill = BOTH, expand = 1)
frame = Frame(board3, relief = RAISED, borderwidth = 10)
frame.pack(side = BOTTOM, fill = BOTH, expand = 1)
export = Button(root, text = 'Export to CSV', width = 20)
export.pack(side = LEFT)
refresh = Button(root, text = 'Refresh', width = 20)
refresh.pack(side = LEFT)
exitbut = Button(root, text = 'Exit', width = 20, command = sys.exit)
exitbut.pack(side = LEFT)
root.mainloop()
if __name__== "__main__":
main()
可以使用Toplevel的"transient"方法来定义每个window的关系。我做了一些修改并确认现在如果您移动根 window,所有 Toplevel windows 都会跟随它。
代码: 从 Tkinter 导入 * 导入系统
def main():
root = Tk()
root.title('skyreach')
root.geometry('1900x1000+0+0')
root.lower()
board = Toplevel(root)
board.transient(root)
board.geometry('1875x200+10+30')
board.title('Tasked')
board1 = Toplevel(root)
board1.transient(root)
board1.geometry('1875x200+10+270')
board1.title('Sched and Confirm')
board2 = Toplevel(root)
board2.transient(root)
board2.geometry('1875x200+10+510')
board2.title('Sched')
board3 = Toplevel(root)
board3.transient(root)
board3.geometry('1875x200+10+750')
board3.title('Completed')
frame = Frame(root, relief = RAISED, borderwidth = 10)
frame.pack(fill = BOTH, expand = 1)
frame = Frame(board, relief = RAISED, borderwidth = 10)
frame.pack(side = BOTTOM, fill = BOTH, expand = 1)
frame = Frame(board1, relief = RAISED, borderwidth = 10)
frame.pack(side = BOTTOM, fill = BOTH, expand = 1)
frame = Frame(board2, relief = RAISED, borderwidth = 10)
frame.pack(side = BOTTOM, fill = BOTH, expand = 1)
frame = Frame(board3, relief = RAISED, borderwidth = 10)
frame.pack(side = BOTTOM, fill = BOTH, expand = 1)
export = Button(root, text = 'Export to CSV', width = 20)
export.pack(side = LEFT)
refresh = Button(root, text = 'Refresh', width = 20)
refresh.pack(side = LEFT)
exitbut = Button(root, text = 'Exit', width = 20, command = sys.exit)
exitbut.pack(side = LEFT)
root.mainloop()
if __name__== "__main__":
main()
在 Windows 7 上,<Configure>
事件在拖动 window 以及调整其大小时触发。您可以使用此事件在移动根 window 时移动 Toplevel window。
示例:
from Tkinter import *
class App():
def __init__(self):
self.root = Tk()
self.root.geometry('300x300+100+100')
self.root.bind('<Configure>', self.root_conf)
self.top = []
self.top.append(Toplevel(self.root))
self.top[0].geometry('200x200+150+150')
self.top[0].transient(self.root)
self.x_off = []
self.y_off = []
self.x_off.append(50)
self.y_off.append(50)
self.top[0].bind('<Configure>', lambda e: self.top_conf(e, 0))
self.top.append(Toplevel(self.root))
self.top[1].geometry('200x200+450+150')
self.top[1].transient(self.root)
self.x_off.append(350)
self.y_off.append(50)
self.top[1].bind('<Configure>', lambda e: self.top_conf(e, 1))
self.root.mainloop()
def root_conf(self, e):
self.top[0].geometry('{}x{}+{}+{}'.format(self.top[0].winfo_width(), self.top[0].winfo_height(), e.x+self.x_off[0], e.y+self.y_off[0]))
self.top[1].geometry('{}x{}+{}+{}'.format(self.top[1].winfo_width(), self.top[1].winfo_height(), e.x+self.x_off[1], e.y+self.y_off[1]))
def top_conf(self, e, num):
self.x_off[num] = e.widget.winfo_x()-self.root.winfo_x()
self.y_off[num] = e.widget.winfo_y()-self.root.winfo_y()
if __name__== "__main__":
App()
请注意,根据@7stud 的评论,这在 MacOSX 上不起作用,因为拖动 window 时不会触发 <Configure>
事件。