Jetzt habe ich es auch mit weight gemacht. Aber bei weight sollte man das Ziehen mit der Maus besser lassen. Denn dabei hat man dann keine Kontrolle mehr, welcher minsizte dann drin ist.
Code: Alles auswählen
# -*- coding: utf-8 -*-
try:
import tkinter as tk
except ImportError:
import Tkinter as tk
class Application(tk.Tk):
def __init__(self,**kwargs):
tk.Tk.__init__(self,**kwargs)
#self.config(height=160, width=300)
self.minsize(300, 200)
# widget definitions ===================================
self.Button = tk.Button(self,padx=1, width=10, text='Button')
self.Button.grid(column=1, row=0)
self.Entry = tk.Button(self,padx=1, width=10, text='Entry')
self.Entry.grid(column=1, row=1)
self.Frame = tk.Button(self,padx='1', width=10, text='Frame')
self.Frame.grid(column=1, row=2)
self.Label = tk.Button(self,padx=1, width=10, text='Label')
self.Label.grid(row=0)
self.Listbox = tk.Button(self,padx=1, width=10, text='Listbox')
self.Listbox.grid(row=1)
self.Text = tk.Button(self,padx='1', width=10, text='Text')
self.Text.grid(row=2)
self.rowconfigure(0,weight=1,minsize = 30)
self.rowconfigure(1,weight=1,minsize = 30)
self.rowconfigure(2,weight=1,minsize = 30)
self.rows = 3
self.cols = 2
self.table_frames = []
self.line_size = 4
self.insert_table()
def insert_table(self,event = None):
for col in range(self.cols):
compare_frame = tk.Frame(self)
compare_frame.grid(column = col,row = 0, rowspan = self.rows, sticky = 'nsw')
frame = LineFrame(self,width = self.line_size, bg = 'black',compare_frame = compare_frame)
frame.grid(column = col,row = 0, rowspan = self.rows, sticky = 'nse')
frame.bind('<Enter>',frame.tableline_enter_col)
frame.bind('<Leave>',frame.tableline_leave)
frame.bind('<Button-1>',frame.tableline_startmove_col)
self.table_frames.append(frame)
for row in range(self.rows):
compare_frame = tk.Frame(self)
compare_frame.grid(column = 0,row = row, columnspan = self.cols, sticky = 'wen')
frame = LineFrame(self,height = self.line_size, bg = 'black',compare_frame = compare_frame)
frame.grid(row = row, column = 0, columnspan = self.cols, sticky = 'wes')
frame.bind('<Enter>',frame.tableline_enter_row)
frame.bind('<Leave>',frame.tableline_leave)
frame.bind('<Button-1>',frame.tableline_startmove_row)
self.table_frames.append(frame)
class LineFrame(tk.Frame):
def __init__(self,master,**kwargs):
# for measuring column or row size
self.compare_frame = kwargs.pop('compare_frame',None)
tk.Frame.__init__(self,master,**kwargs)
self.master = master
def tableline_enter_col(self,event=None):
self.lift()
self.config( cursor = 'sb_h_double_arrow', bg = 'lightgreen')
def tableline_enter_row(self,event=None):
self.lift()
self.config( cursor = 'sb_v_double_arrow', bg = 'lightgreen')
def tableline_leave(self,event=None):
self.config( cursor = '', bg = 'black')
def tableline_startmove_col(self,event = None):
self.mouse_startpos = self.master.winfo_pointerx()
self.mouse_before = self.mouse_startpos
x_line = self.winfo_rootx()
self.dx = x_line - self.mouse_startpos
self.row_col = int(self.grid_info()['column'])
self.line_configure = self.master.grid_columnconfigure
self.row_col_config = self.line_configure(self.row_col)
self.weight = int(self.row_col_config['weight'])
self.measure_size = self.measure_colwidth
self.measure_size()
self.start_size = self.cellsize
self.start_begin = self.begin
self.is_moving = True
self.unbind('<Enter>')
self.unbind('<Leave>')
self.bind('<ButtonRelease-1>',self.button_release_col)
self.startmove = self.tableline_startmove_col
self.enter = self.tableline_enter_col
self.pointer = self.master.winfo_pointerx
self.move()
def tableline_startmove_row(self,event = None):
self.mouse_startpos = self.master.winfo_pointery()
self.mouse_before = self.mouse_startpos
y_line = self.winfo_rooty()
self.dy = y_line - self.mouse_startpos
self.row_col = int(self.grid_info()['row'])
self.line_configure = self.master.grid_rowconfigure
self.row_col_config = self.line_configure(self.row_col)
self.weight = int(self.row_col_config['weight'])
self.measure_size = self.measure_rowheight
self.measure_size()
self.start_size = self.cellsize
self.start_begin = self.begin
self.is_moving = True
self.unbind('<Enter>')
self.unbind('<Leave>')
self.bind('<ButtonRelease-1>',self.button_release_row)
self.startmove = self.tableline_startmove_row
self.enter = self.tableline_enter_row
self.pointer = self.master.winfo_pointery
self.move()
def measure_colwidth(self):
left_x = self.compare_frame.winfo_rootx()
right_x = self.winfo_rootx() + self.winfo_width()
self.cellsize = right_x - left_x
self.begin = left_x
self.end = right_x
def set_size(self):
self.row_col_config['minsize'] = self.cellsize - 2 * int(self.row_col_config['pad'])
self.line_configure(self.row_col,**self.row_col_config)
def measure_rowheight(self):
top_y = self.compare_frame.winfo_rooty()
bottom_y = self.winfo_rooty() + self.winfo_height()
self.cellsize = bottom_y - top_y
self.begin = top_y
self.end = bottom_y
def update_weight_release(self):
#pos_mouse = self.pointer()
#dpos = pos_mouse - self.mouse_startpos
self.measure_size()
self.new_cellsize = self.start_size + self.start_begin - self.begin + self.dpos
if self.cellsize != self.new_cellsize:
self.increase = 1 if self.new_cellsize > self.cellsize else -1
self.update_minsize()
self.after(1,self.update_minsize)
else:
self.bind('<Button-1>',self.startmove)
self.bind('<Enter>',self.enter)
self.bind('<Leave>',self.tableline_leave)
def button_release_col(self,event = None):
self.unbind('<ButtonRelease-1>')
self.is_moving = False
if self.weight:
self.unbind('<Button-1>')
self.new_cellsize = self.cellsize
self.row_col_config['weight'] = self.weight
self.line_configure(self.row_col,weight = self.weight)
self.tableline_leave()
self.after(100,self.update_weight_release)
return
self.bind('<Enter>',self.tableline_enter_col)
self.bind('<Leave>',self.tableline_leave)
def button_release_row(self,event = None):
self.unbind('<ButtonRelease-1>')
self.is_moving = False
if self.weight:
self.unbind('<Button-1>')
self.new_cellsize = self.cellsize
self.row_col_config['weight'] = self.weight
self.line_configure(self.row_col,**self.row_col_config)
self.tableline_leave()
self.after(100,self.update_weight_release)
return
self.bind('<Enter>',self.tableline_enter_row)
self.bind('<Leave>',self.tableline_leave)
def update_minsize(self):
if self.increase > 0 and self.cellsize < self.new_cellsize or self.increase < 0 and self.cellsize > self.new_cellsize:
minsize = self.row_col_config['minsize']
if self.increase > 0 and minsize < self.new_cellsize or self.increase < 0 and minsize > 0:
#print('tit')
self.row_col_config['minsize'] = minsize + self.increase
self.line_configure(self.row_col,**self.row_col_config)
self.measure_size()
self.after(1,self.update_minsize)
elif self.is_moving:
self.after(20,self.move)
else:
#self.after(1,self.update_weight_release())
self.bind('<Button-1>',self.startmove)
self.bind('<Enter>',self.enter)
self.bind('<Leave>',self.tableline_leave)
elif self.is_moving:
self.after(20,self.move)
else:
self.bind('<Button-1>',self.startmove)
self.bind('<Enter>',self.enter)
self.bind('<Leave>',self.tableline_leave)
def move(self):
pos_mouse = self.pointer()
dpos = pos_mouse - self.mouse_startpos
self.dpos = dpos
self.measure_size()
self.new_cellsize = self.start_size + self.start_begin - self.begin + dpos
if self.new_cellsize != self.cellsize:
if not self.weight:
self.cellsize = self.new_cellsize
self.set_size()
if self.is_moving:
self.after(20,self.move)
else:
self.increase = 1 if self.new_cellsize > self.cellsize else -1
self.update_minsize()
elif self.is_moving:
self.after(20,self.move)
if __name__ == '__main__':
Application().mainloop()