Python 窗内窗

Python 窗内窗,python,tkinter,window,Python,Tkinter,Window,我对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") mainl

我对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()
它看起来是这样的:

我想知道如何隔离子窗口,使其保持在主窗口内,即使我将其拖出


非常感谢。

虽然有足够的构建块来构建您自己的,但没有任何内置功能来促进这一点。例如,您可以使用一些自定义绑定创建框架,这些绑定允许您使用
place
geometry管理器在其父框架周围移动框架

没有这样做的内置方法。但是我做了一个变通来适应它。请记住,当试图将子窗口移到主窗口外时,它不是一个平滑的锁,因此它确实会跳起来。另一个问题是,由于配置事件,我无法获得相对于主窗口的子窗口位置,以便在移动主窗口时保持它。还在努力解决这个问题。但是,下面的代码确实有效,应该对您有用

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()
将tkinter作为tk导入
root=tk.tk()
root.title(“主窗口”)
根几何(“640x480”)
sub=tk.Toplevel(根)
sub.transient(root)#将子窗口保持在root的顶部
子标题(“子窗口”)
sub.minsize(320240)
sub.maxsize(320240)
pos=[]
def主_移动(事件):
#当主窗口移动时,调整子窗口使其随之移动
如果pos:
sub.geometry(“+{0}+{1}.”格式(pos[0],pos[1]))
#将位置[0]和位置[1]更改为固定位置的定义值(如50)
def sub_移动(事件):
#设置最小值
min_w=root.winfo_rootx()
min_h=root.winfo_rooty()
#设置最大值减去窗口边框的缓冲区
max_w=root.winfo_rootx()+root.winfo_width()-15
max_h=root.winfo_rooty()+root.winfo_height()-35
#将子窗口保留在主窗口中的条件语句
如果事件x最大宽度:
sub.geometry(“+{0}+{1}.”格式(max_w-event.width,event.y))
elif事件y+事件高度>最大高度:
sub.geometry(“+{0}+{1}.”格式(event.x,max_h-event.height))
全球pos
#设置当前子窗口位置
pos=[event.x,event.y]
根绑定(“”,主移动)
sub.bind(“”,sub_move)
root.mainloop()

你能发布你的代码吗?@awbemauler我也很乐意,但我不知道从哪里开始。但我会试试看。谢谢你的回复。sub.overridedirect(1)应该和Steven的一起完成这个任务code@Desai我刚试过,子窗口总是在人窗口后面。当你试图把子窗口拖到外面或者简单地“触摸”时,它确实会跳起来主窗口的边框。顺便说一句,我会尝试创建正常的可移动的
框架
s,模拟顶层窗口(您可以添加关闭、最大化和最小化按钮、它们的行为、边框、标题等)。