Tkinter:没有标题栏但可调整大小的窗口

Dic*_*ong 8 python resize tk-toolkit tkinter titlebar

我所知道的是,如果我想创建一个没有标题栏的窗口,我可以写

    root = Tk()
    ........
    root.overrideredirect(1)
Run Code Online (Sandbox Code Playgroud)

但我也希望窗口可以调整大小.有什么解决方案吗?

(仅供参考:我正在使用Windows机器,虽然我不确定它是否真的很重要.如果有独立于操作系统的解决方案,它将是完美的,但如果至少有Windows的解决方案,我很高兴.)

Bry*_*ley 9

问题是,窗口可调整大小的,但是当你打开时,overrideredirect你会丢失任何类型的标题或边缘,你可以抓住它来调整窗口的大小.唯一的解决方案是实现自己调整大小.您可以添加自己的边框,或添加鼠标靠近边缘时有效的鼠标绑定.

这个答案显示了如何移动这样一个窗口:Python/Tkinter:鼠标拖动一个没有边框的窗口,例如.overridedirect(1)

这是一个简短的例子,说明了调整大小.它几乎没有在OSX上测试过,但应该可以在任何平台上运行.它使用python2,虽然只需更改import语句就可以使用python3.

import Tkinter as tk
import ttk

class Example(tk.Tk):
    def __init__(self):
        tk.Tk.__init__(self)
        self.floater = FloatingWindow(self)

class FloatingWindow(tk.Toplevel):
    def __init__(self, *args, **kwargs):
        tk.Toplevel.__init__(self, *args, **kwargs)
        self.overrideredirect(True)
        self.wm_geometry("400x400")

        self.label = tk.Label(self, text="Grab the lower-right corner to resize")
        self.label.pack(side="top", fill="both", expand=True)

        self.grip = ttk.Sizegrip(self)
        self.grip.place(relx=1.0, rely=1.0, anchor="se")
        self.grip.lift(self.label)
        self.grip.bind("<B1-Motion>", self.OnMotion)


    def OnMotion(self, event):
        x1 = self.winfo_pointerx()
        y1 = self.winfo_pointery()
        x0 = self.winfo_rootx()
        y0 = self.winfo_rooty()
        self.geometry("%sx%s" % ((x1-x0),(y1-y0)))
        return

app=Example()
app.mainloop()
Run Code Online (Sandbox Code Playgroud)