我对python的tkinter不太好,但我想知道是否有办法在窗口内创建一个窗口,那个窗口无法离开主窗口的边界。
继承我目前的代码:
from tkinter import *
root = Tk()
root.title("Main Window")
root.geometry("640x480+100+100")
sub = Toplevel(root)
sub.title("Sub Window")
sub.geometry("320x240+125+125")
mainloop()
我想知道如何将子窗口隔离到主窗口中,即使我将其拖出来也是如此。
非常感谢。
答案 0 :(得分:2)
没有这样做的内置方法。但是我已经做了一些工作来适应它。请记住,当尝试将子窗口移动到主窗口之外时,它不是一个平滑的锁定,因此它会变得有弹性。另一个问题是,由于配置事件,我无法获得相对于主窗口的子窗口位置,以便在移动主窗口时保持它。仍在解决这个问题。但是,下面的代码确实有用,应该对您有用。
import tkinter as tk
root = tk.Tk()
root.title("Main Window")
root.geometry("640x480")
sub = tk.Toplevel(root)
sub.transient(root) #Keeps sub window on top of root
sub.title('Sub Window')
sub.minsize(320, 240)
sub.maxsize(320, 240)
pos = []
def main_move(event):
#When the main window moves, adjust the sub window to move with it
if pos:
sub.geometry("+{0}+{1}".format(pos[0], pos[1]))
# Change pos[0] and pos[1] to defined values (eg 50) for fixed position from main
def sub_move(event):
# Set the min values
min_w = root.winfo_rootx()
min_h = root.winfo_rooty()
# Set the max values minus the buffer for window border
max_w = root.winfo_rootx() + root.winfo_width() - 15
max_h = root.winfo_rooty() + root.winfo_height() - 35
# Conditional statements to keep sub window inside main
if event.x < min_w:
sub.geometry("+{0}+{1}".format(min_w, event.y))
elif event.y < min_h:
sub.geometry("+{0}+{1}".format(event.x, min_h))
elif event.x + event.width > max_w:
sub.geometry("+{0}+{1}".format(max_w - event.width, event.y))
elif event.y + event.height > max_h:
sub.geometry("+{0}+{1}".format(event.x, max_h - event.height))
global pos
# Set the current sub window position
pos = [event.x, event.y]
root.bind('<Configure>', main_move)
sub.bind('<Configure>', sub_move)
root.mainloop()
答案 1 :(得分:1)
虽然有足够的构建块来构建自己的构建块,但没有任何内置功能可以实现这一点。例如,您可以创建一个包含一些自定义绑定的框架,允许您使用place
几何管理器在其父项周围移动它。