私の目標は、ユーザがテキストウィジェットのサイズを変更できるようにする「サイズグリップウィジェット」を持つことです。tkinter - テキストウィジェット(テキストウィジェットのサイズグリップ)のサイズ変更
画像は説明する:
それはsizegripウィジェットは、テキストウィジェットの代わりに、ルートウィンドウのサイズを変更することが可能です(私は悪いグリッド化のために謝罪しますか)?
私のニーズに合った代替ウィジェットはありますか?
私の目標は、ユーザがテキストウィジェットのサイズを変更できるようにする「サイズグリップウィジェット」を持つことです。tkinter - テキストウィジェット(テキストウィジェットのサイズグリップ)のサイズ変更
画像は説明する:
それはsizegripウィジェットは、テキストウィジェットの代わりに、ルートウィンドウのサイズを変更することが可能です(私は悪いグリッド化のために謝罪しますか)?
私のニーズに合った代替ウィジェットはありますか?
実際にこれを行うには、place
を使用して、テキストウィジェット、スクロールバー、およびサイズグリップを含むフレームを管理する例があります。既定のバインディングを削除し、サイズグリップ用の新しいバインディングを追加すると、トップレベルのジオメトリを変更して他の操作を行わないようにすることができます。 この種のものでは、1つまたは2つのパンウィンドウがより一般的なUIデザインであることに注意してください。
import sys
import tkinter as tk
import tkinter.ttk as ttk
class App(ttk.Frame):
def __init__(self, parent, title=None):
super().__init__(parent)
parent.wm_geometry("600x400")
parent.wm_title(title)
self.top = tk.Frame(self, height=100, background="green4")
self.middle = tk.Frame(self, background="red4")
self.lower = tk.Frame(self, height=100, background="blue4")
self.textframe = ttk.Frame(self.middle)
self.text = tk.Text(self.textframe)
self.vs = ttk.Scrollbar(self.textframe,
command=self.text.yview)
self.sg = ttk.Sizegrip(self.textframe)
self.text.configure(yscrollcommand=self.vs.set)
self.text.grid(row=0, column=0, sticky="news")
self.vs.grid(row=0, column=1, sticky="news")
self.sg.grid(row=1, column=1, sticky="sew")
self.textframe.grid_rowconfigure(0, weight=1)
self.textframe.grid_columnconfigure(0, weight=1)
self.middle.bind('<Map>', self.Place)
self.sg.bindtags((self.sg, '.','all'))
self.sg.bind('<Button-1>', self.Press)
self.sg.bind('<B1-Motion>', self.Drag)
self.sg.bind('<ButtonRelease-1>', self.Release)
self.top.grid(row=0, column=0, sticky="news")
self.middle.grid(row=1, column=0, sticky="news")
self.lower.grid(row=2, column=0, sticky="news")
self.grid_rowconfigure(1, weight=1)
self.grid_columnconfigure(0, weight=1)
self.grid(row=0,column=0, sticky="news")
parent.grid_rowconfigure(0, weight=1)
parent.grid_columnconfigure(0, weight=1)
def Press(self, ev):
self.dragging=True
self.dragpos = (ev.x_root, ev.y_root)
def Drag(self, ev):
if self.dragging:
dx = ev.x_root - self.dragpos[0]
dy = ev.y_root - self.dragpos[1]
sgx = self.sg.winfo_x() + dx
sgy = self.sg.winfo_y() + dy
sgw = self.sg.winfo_reqwidth()
sgh = self.sg.winfo_reqheight()
max_w = self.middle.winfo_width() - sgw
max_h = self.middle.winfo_height() - sgh
if sgx < 0 or sgx > max_w or sgy < 0 or sgy > max_h:
return
self.textframe.place(x=0, y=0,
width=sgx+sgw, height=sgy+sgh)
self.dragpos = (ev.x_root, ev.y_root)
def Release(self, ev):
self.dragging=False
def Place(self, ev):
"""Place the text widget controls once the rest of the
application has been mapped so we actually have a size
to work from.
Reset the Map event to avoid re-calling this code."""
self.textframe.bind('<Map>', None)
self.textframe.place(x=0, y=0,
width=self.middle.winfo_width(),
height=self.middle.winfo_height())
def main(args=None):
root = tk.Tk()
app = App(root, "Sizegrip demo")
root.mainloop()
return 0
if __name__ == '__main__':
sys.exit(main(sys.argv[1:]))
ヒットは可能なはずですが、おそらく容易ではないだろう。テキストウィジェットの下のウィジェットで何が起こると思われますか? –
彼らはちょうど下に移動します。テキストウィジェットの増加率を想像してみてください。私は実際にテキストウィジェットの幅の大きさを気にしません。実際には私はそれについては、私はおそらくあなたがテキストのウィジェットの高さのサイズを変更することができる場合は、おそらく良いでしょう。 – Bjango
_余分なスペースがない場合はどうしますか?ウィンドウのサイズを変更すると、テキストウィジェットが大きくなるようにUIを設計するだけではいかがですか? –