Wie bekomme ich grid_rowconfigure wieder weg?
-
- User
- Beiträge: 1715
- Registriert: Freitag 31. Juli 2015, 13:34
Hat sich erledigt. Brauch nur min width und min heigt wieder auf 0 setzen
-
- User
- Beiträge: 1715
- Registriert: Freitag 31. Juli 2015, 13:34
Hab die Änderungen wieder auf Github gepusht
-
- User
- Beiträge: 1715
- Registriert: Freitag 31. Juli 2015, 13:34
Hi wuf, neugierig?
Ich benutze nur einen einfachen Label mit relief solid: {'height': '0', 'width': '0', 'relief': 'solid','bg':'#b3d9d9','padx':0,'pady':0}
Und mach dann ein grid mit sticky = 'news'
Ich schreibe 'news' statt so etwas wie 'nesw', denn das kann ich mir prima merken.
Einfach, aber wirkungsvoll, oder?
Ich benutze nur einen einfachen Label mit relief solid: {'height': '0', 'width': '0', 'relief': 'solid','bg':'#b3d9d9','padx':0,'pady':0}
Und mach dann ein grid mit sticky = 'news'
Ich schreibe 'news' statt so etwas wie 'nesw', denn das kann ich mir prima merken.
Einfach, aber wirkungsvoll, oder?
Hi Alfons
Ich machte einen Versuch mit einem kleinen Skript, welches eine Tabelle mit Frames als Tabellen-Elemente erzeugte. Ich kann bei dieser Tabelle auch Reihen und Spalten mit Änderung deren Optionen width & height=0 zum verschwinde bringen. Die so unsichtbar gemachten Element bleiben aber bestehen. Man müsste eigendlich die Tabellen-Elemente (bei mir die Frame-Elemente) destroy'en. Ausser es stört in deinem Fall nicht.
N.B. Dein Tipp mit sticky='news' (genial!)
Gruss wuf
Ich machte einen Versuch mit einem kleinen Skript, welches eine Tabelle mit Frames als Tabellen-Elemente erzeugte. Ich kann bei dieser Tabelle auch Reihen und Spalten mit Änderung deren Optionen width & height=0 zum verschwinde bringen. Die so unsichtbar gemachten Element bleiben aber bestehen. Man müsste eigendlich die Tabellen-Elemente (bei mir die Frame-Elemente) destroy'en. Ausser es stört in deinem Fall nicht.
N.B. Dein Tipp mit sticky='news' (genial!)
Gruss wuf
Take it easy Mates!
-
- User
- Beiträge: 1715
- Registriert: Freitag 31. Juli 2015, 13:34
HI wuf, Du hast es erfaßt. Die Tabellenelemente muss man destroyen. In meinem Script geschieht das durch: deleteWidgetsForName(container(),NONAME)
Das macht ein destroy für alle Widgets im betreffenden Container, die den Namen NONAME haben. Und die zeige ich auch nicht im Selektions Teil an.
Das macht ein destroy für alle Widgets im betreffenden Container, die den Namen NONAME haben. Und die zeige ich auch nicht im Selektions Teil an.
Hi Alfons
Hier noch mein erwähntes Testskript mit der Tabelle:
Gruss wuf
Hier noch mein erwähntes Testskript mit der Tabelle:
Code: Alles auswählen
#!/usr/bin/env python
# -*- coding: utf-8 -*-
from functools import partial
try:
# Tkinter for Python 2.xx
import Tkinter as tk
import tkFont as fnt
except:
# Tkinter for Python 3.xx
import tkinter as tk
import tkinter.font as fnt
APP_TITLE = "Testtabelle mit Frames"
APP_XPOS = 100
APP_YPOS = 100
APP_WIDTH = 300
APP_HEIGHT = 200
BUTTON_01 = 'Letzte horizontale\nReihe entfernen'
BUTTON_02 = 'Letzte vertikale\nKolonne entfernen'
BUTTONS = [BUTTON_01, BUTTON_02]
HORIZONTAL = 'horz'
VERTICAL = 'vert'
class SimpleTable(tk.Frame):
def __init__(self, parent, rows, columns):
self.parent = parent
self.rows = rows
self.columns = columns
tk.Frame.__init__(self, parent, background="black")
self.cells = []
for row in range(rows):
current_row = []
for column in range(columns):
frame = tk.Frame(self, borderwidth=1, width=200, height=30,
relief='raised')
frame.grid(row=row, column=column, sticky="nsew")
current_row.append(frame)
self.cells.append(current_row)
for column in range(columns):
self.grid_columnconfigure(column, weight=1)
def set(self, row, column, value):
widget = self.cells[row][column]
widget.configure(height=0)
def remove_row(self, row=6):
for label in self.cells[row]:
label.config(height=0)
label.update_idletasks()
def remove_cells(self, direction):
if direction == VERTICAL:
# Remove last column on the right side of the table
last_column = len(self.cells[0])
last_row = len(self.cells)
#print('Rows:', last_row)
for row in range(last_row):
print(row)
self.cells[row][last_column-1].destroy()
del self.cells[row][last_column-1:]
#print(len(self.cells[0]))
if direction == HORIZONTAL:
# Remove last row on the botton side of the table
last_column = len(self.cells[0])
last_row = len(self.cells)
#print('Columns:', last_column)
for column in range(last_column):
print(column)
self.cells[last_row-1][column].destroy() #config(height=0)
del self.cells[last_row-1:]
#print(self.cells)
class Application(tk.Frame):
def __init__(self, master):
self.master = master
self.master.protocol("WM_DELETE_WINDOW", self.close)
tk.Frame.__init__(self, master)
self.table = SimpleTable(self, rows=7, columns=6)
self.table.pack(side="top", fill="x")
#table.set(0,0,"Hello, world")
self.master.geometry('')
button_frame = tk.Frame(self)
button_frame.pack()
[tk.Button(button_frame, text=button_text,
command=partial(self.on_button_press, button_text)).pack(
side='left', pady=5)
for button_text in BUTTONS]
def on_button_press(self, button):
if button == BUTTON_01:
self.remove_cells(HORIZONTAL)
if button == BUTTON_02:
self.remove_cells(VERTICAL)
def remove_cells(self, direction):
self.table.remove_cells(direction)
def close(self):
print("Application-Shutdown")
self.master.destroy()
def main():
app_win = tk.Tk()
app_win.title(APP_TITLE)
app_win.geometry("+{}+{}".format(APP_XPOS, APP_YPOS))
app_win.geometry("{}x{}".format(APP_WIDTH, APP_HEIGHT))
app = Application(app_win)
app.pack(fill='both', expand=True, padx=0, pady=0)
app_win.mainloop()
if __name__ == '__main__':
main()
Take it easy Mates!
-
- User
- Beiträge: 1715
- Registriert: Freitag 31. Juli 2015, 13:34
Hi wuf, noch ein Tipp: das lower nicht vergessen:Wenn Du ein Widget drüberziehst, soll es ja darüber erscheinen und nicht dahinter versteckt sein.
Hab mir Deinen Code jetzt angeschaut. Wolltest ja gar nichts drüberziehen.
Code: Alles auswählen
for row in range(rows):
fill_cell = {'height': '0', 'width': '0', 'relief': 'solid','bg':'#b3d9d9','padx':0,'pady':0}
for col in range(cols):
Label(NONAME,**fill_cell).rcgrid(row,col,sticky='news')
this().lower()
Hab mir Deinen Code jetzt angeschaut. Wolltest ja gar nichts drüberziehen.
Zuletzt geändert von Alfons Mittelmeyer am Sonntag 4. Oktober 2015, 19:46, insgesamt 1-mal geändert.
Hi Alfons
Warum braucht es dein vorgeschlagenes lower nicht?
Gruss wuf
Aber hier ziehe ich etwas darüber:Alfons Mittelmeyer hat geschrieben:Hab mir Deinen Code jetzt angeschaut. Wolltest ja gar nichts drüberziehen.
Code: Alles auswählen
#!/usr/bin/env python
# -*- coding: utf-8 -*-
from functools import partial
try:
# Tkinter for Python 2.xx
import Tkinter as tk
import tkFont as fnt
except:
# Tkinter for Python 3.xx
import tkinter as tk
import tkinter.font as fnt
APP_TITLE = "Testtabelle mit Frames"
APP_XPOS = 100
APP_YPOS = 100
APP_WIDTH = 300
APP_HEIGHT = 200
BUTTON_01 = 'Letzte horizontale\nReihe entfernen'
BUTTON_02 = 'Letzte vertikale\nKolonne entfernen'
BUTTON_03 = 'Platziere 3x3-Element\n Frame'
BUTTONS = [BUTTON_01, BUTTON_02, BUTTON_03]
HORIZONTAL = 'horz'
VERTICAL = 'vert'
class SimpleTable(tk.Frame):
def __init__(self, parent, rows, columns):
self.parent = parent
self.rows = rows
self.columns = columns
tk.Frame.__init__(self, parent, background="black")
self.cells = []
for row in range(rows):
current_row = []
for column in range(columns):
frame = tk.Frame(self, borderwidth=1, width=200, height=30,
relief='raised')
frame.grid(row=row, column=column, sticky="nsew")
current_row.append(frame)
self.cells.append(current_row)
for column in range(columns):
self.grid_columnconfigure(column, weight=1)
def set(self, row, column, value):
widget = self.cells[row][column]
widget.configure(height=0)
def remove_row(self, row=6):
for label in self.cells[row]:
label.config(height=0)
label.update_idletasks()
def remove_cells(self, direction):
if direction == VERTICAL:
# Remove last column on the right side of the table
last_column = len(self.cells[0])
last_row = len(self.cells)
#print('Rows:', last_row)
for row in range(last_row):
print(row)
self.cells[row][last_column-1].destroy()
del self.cells[row][last_column-1:]
#print(len(self.cells[0]))
if direction == HORIZONTAL:
# Remove last row on the bottom side of the table
last_column = len(self.cells[0])
last_row = len(self.cells)
#print('Columns:', last_column)
for column in range(last_column):
print(column)
self.cells[last_row-1][column].destroy() #config(height=0)
del self.cells[last_row-1:]
#print(self.cells)
def add_big_frame(self):
self.big_frame = tk.Frame(self, bg='red', bd=1, relief='raised')
self.big_frame.grid(row=0, column=0, rowspan=3, columnspan=3,
sticky='news')
self.button = tk.Button(self.big_frame, text='Hello!', bd=1,
highlightthickness=0)
self.button.pack(expand=True)
class Application(tk.Frame):
def __init__(self, master):
self.master = master
self.master.protocol("WM_DELETE_WINDOW", self.close)
tk.Frame.__init__(self, master)
self.table = SimpleTable(self, rows=7, columns=6)
self.table.pack(side="top", fill="x")
#table.set(0,0,"Hello, world")
self.master.geometry('')
button_frame = tk.Frame(self)
button_frame.pack()
[tk.Button(button_frame, text=button_text,
command=partial(self.on_button_press, button_text)).pack(
side='left', pady=5)
for button_text in BUTTONS]
def on_button_press(self, button):
if button == BUTTON_01:
self.remove_cells(HORIZONTAL)
if button == BUTTON_02:
self.remove_cells(VERTICAL)
if button == BUTTON_03:
self.table.add_big_frame()
def remove_cells(self, direction):
self.table.remove_cells(direction)
def close(self):
print("Application-Shutdown")
self.master.destroy()
def main():
app_win = tk.Tk()
app_win.title(APP_TITLE)
app_win.geometry("+{}+{}".format(APP_XPOS, APP_YPOS))
app_win.geometry("{}x{}".format(APP_WIDTH, APP_HEIGHT))
app = Application(app_win)
app.pack(fill='both', expand=True, padx=0, pady=0)
app_win.mainloop()
if __name__ == '__main__':
main()
Gruss wuf
Take it easy Mates!
-
- User
- Beiträge: 1715
- Registriert: Freitag 31. Juli 2015, 13:34
Hi wuf,
ob man ein lower() braucht oder nicht kommt auf die Reihenfolge der Widget Erzeugung an. Wenn Du zuerst den Tabellenhintergrund erzeugst und nachher erst Widgets, um die darauf zu platzzieren, brauchst Du ein lower nicht.
Wenn Du aber erst Widgets erzeugst und dann den Hintergrund und willst dann die Widgets darauf platzieren, dann brauchst Du entweder lower für den Hintergrund oder
ein lift für die Widgets.
Da bei mir dieser Fall eintreten kann, habe ich es gebraucht.
ob man ein lower() braucht oder nicht kommt auf die Reihenfolge der Widget Erzeugung an. Wenn Du zuerst den Tabellenhintergrund erzeugst und nachher erst Widgets, um die darauf zu platzzieren, brauchst Du ein lower nicht.
Wenn Du aber erst Widgets erzeugst und dann den Hintergrund und willst dann die Widgets darauf platzieren, dann brauchst Du entweder lower für den Hintergrund oder
ein lift für die Widgets.
Da bei mir dieser Fall eintreten kann, habe ich es gebraucht.