窗口内的窗口

时间:2015-08-01 18:32:19

标签: 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")

mainloop()

它看起来像这样: enter image description here

我想知道如何将子窗口隔离到主窗口中,即使我将其拖出来也是如此。

非常感谢。

2 个答案:

答案 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几何管理器在其父项周围移动它。