Wie bekomme ich grid_rowconfigure wieder weg?

Fragen zu Tkinter.
Alfons Mittelmeyer
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
Alfons Mittelmeyer
User
Beiträge: 1715
Registriert: Freitag 31. Juli 2015, 13:34

Hab die Änderungen wieder auf Github gepusht
Benutzeravatar
wuf
User
Beiträge: 1529
Registriert: Sonntag 8. Juni 2003, 09:50

Hi Alfons

Welche Widgets verwendest du für die Tabellen-Elemente die du mit 'show' einblendest um weiter Widgets darauf zu platzieren? Sorry bin zu faul in deinen Skripten herumzustöbern.

Gruss wuf :wink:
Take it easy Mates!
Alfons Mittelmeyer
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?
Benutzeravatar
wuf
User
Beiträge: 1529
Registriert: Sonntag 8. Juni 2003, 09:50

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 :wink:
Take it easy Mates!
Alfons Mittelmeyer
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.
Benutzeravatar
wuf
User
Beiträge: 1529
Registriert: Sonntag 8. Juni 2003, 09:50

Hi Alfons

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()
Gruss wuf :wink:
Take it easy Mates!
Alfons Mittelmeyer
User
Beiträge: 1715
Registriert: Freitag 31. Juli 2015, 13:34

Hi wuf, noch ein Tipp: das lower nicht vergessen:

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()
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.
Zuletzt geändert von Alfons Mittelmeyer am Sonntag 4. Oktober 2015, 19:46, insgesamt 1-mal geändert.
Benutzeravatar
wuf
User
Beiträge: 1529
Registriert: Sonntag 8. Juni 2003, 09:50

Ok

Danke für den Tipp.

Gruss wuf :wink:
Take it easy Mates!
Benutzeravatar
wuf
User
Beiträge: 1529
Registriert: Sonntag 8. Juni 2003, 09:50

Hi Alfons
Alfons Mittelmeyer hat geschrieben:Hab mir Deinen Code jetzt angeschaut. Wolltest ja gar nichts drüberziehen.
Aber hier ziehe ich etwas darüber:

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()
Warum braucht es dein vorgeschlagenes lower nicht?

Gruss wuf :wink:
Take it easy Mates!
Alfons Mittelmeyer
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.
Antworten