82500


以下のコードではresizeができません。

[code]

    app = tk.Tk()
    app.overrideredirect(True)
    app.resizable(True, True)
    # 略
    
[/code]


CC BY-SA 4.0
2021-09-15T07:38:26.273
82498
2021-09-15T20:53:56.510
2021-09-15T09:29:16.803
3060
47787
question
python python3 tkinter gui
Tkinterで、overrideredirectを適用して、resizableをTrueにする方法はありますか？


[overrideredirect](https://web.archive.org/web/20200731093951id_/http://effbot.org/tkinterbook/wm.htm#Tkinter.Wm.overrideredirect-
method)を無効化するとタイトルバーやフレームの枠線がなくなるため、自力で実装しないとリサイズできないようです。

[本家SOの類似質問](https://stackoverflow.com/a/22424245)ではttkの[Sizegrip](https://docs.python.org/ja/3/library/tkinter.ttk.html#sizegrip)を利用してリサイズを実装しています。

**類似質問の回答から転載したコード**

[code]

    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()
    
[/code]


CC BY-SA 4.0
2021-09-15T08:30:00.013
82500
2021-09-15T08:30:00.013
9820
82498
answer


別解として、以下のコードでは Shift キー +
マウス左クリックでウィンドウフレームの表示・非表示を切り替えます(トグル)。ウィンドウフレームを表示することでリサイズが可能となります。

[code]

    import tkinter as tk
    
    def toggleOverrideRedirect(ev):
      win = ev.widget.winfo_toplevel()
      win.overrideredirect(not win.overrideredirect())
      win.withdraw()
      win.deiconify()
      win.focus_force()
    
    if __name__ == '__main__':
      app = tk.Tk()
      app.geometry('300x300+50+50')
    
      app.overrideredirect(True)
      app.bind("<Shift-ButtonPress-1>", toggleOverrideRedirect)
    
      app.mainloop()
    
[/code]


CC BY-SA 4.0
2021-09-15T20:24:21.587
82517
2021-09-15T20:53:56.510
2021-09-15T20:53:56.510
47127
47127
82498
answer