auf dynamisch erstellte Label zugreifen oder deren Namen ändern?

Fragen zu Tkinter.
Antworten
Phraya
User
Beiträge: 11
Registriert: Dienstag 31. März 2020, 15:13

Ich möchte gerne eine Funktion schreiben, die mir dynamisch eine Tabelle aus Label Widgets baut. Das funktioniert auch soweit schon gut. Aber WIE kann ich den einzelnen Labelfeldern später ihren Inhalt zuweisen?

Wie bekomme ich die Namen heraus und weiss dann auch noch welches sich wo in der Tabelle befindet?
Kann ich die Namen dann nachträglich noch irgendwie ändern?
Oder gibt es irgendeine Möglichkeit bei der Erstellung bereits eigene Namen zu vergeben - wie in meinem Beispiel z.B. der text in den Labels (C1R1) fur column1 row1 ???


application.py

Code: Alles auswählen

from test_layout_class import *
import tkinter as tk


class Window():
    def __init__(self,title="dhd", size="1200x600", bg_color="#181a23"):
        self.win = tk.Tk()
        self.win.title(title)
        self.win.geometry(size)

    def foo(self):
        new_table = LayoutClass(self.win)
        new_table.sipmple_table()


new_app = Window()
new_app.foo()
mainloop()



test_layout_class

Code: Alles auswählen

from tkinter import *

class LayoutClass():

    def __init__(self, target):
        self.target = target

    def sipmple_table(self):
        table = Frame(self.target, bg="#b0bbce", padx=1, pady=1)
        height = 11
        width = 10

        table_title = Label(table, text="Titel", bg="#bad2fc")
        table_title.grid(row=0, column=0, columnspan=width, sticky="nsew")

        for y in range(1, width):
            for x in range(1, height):
                cell = Label(table,text="C"+str(y)+"R"+str(x))
                cell.config(bg="#d7e4fb", padx=4, pady=4, width=10)
                cell.grid(row=x, column=y-1, padx=1, pady=1)
        table.pack()
        
        
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Du musst die in eine Datenstruktur speichern. Zb eine Liste von Listen. Dann kannst du mit

labels[x][y]

auf eines zugreifen.
Sirius3
User
Beiträge: 18289
Registriert: Sonntag 21. Oktober 2012, 17:20

Eine Klasse pro Datei ist Java, das macht man aber in Python nicht. Die Layout-Klasse ist auch nicht wirklich sinnvoll. Sie besteht ja nur aus einer Methode.
Benutze keine *-Importe, was Du ja komischerweise in application.py auch beherzigt hast.
In __init__ sollte das komplette Fenster erzeugt werden.
Klassen erkennt man am großen Anfangsbuchstaben, da muß nicht Class im Namen sein.
Row `x` und Column `y` zu nennen, ist sehr verwirrend.
Strings stückelt man nicht mit + zusammen sondern benutzt Stringformatierung.
Warum heißen Deine Variablen new_xxx, die sind ziemlich schnell nicht mehr neu, das hat überhaupt keine Aussagekaft.

Code: Alles auswählen

import tkinter as tk

class Table(tk.Frame):
    def __init__(self, target, rows=11, columns=10):
        super().__init__(target, bg="#b0bbce", padx=1, pady=1)
        self.target = target
        self.table_title = tk.Label(self, text="Titel", bg="#bad2fc")
        self.table_title.grid(row=0, column=0, columnspan=columns, sticky="nsew")
        self.cells = []
        for row in range(1, rows + 1):
            cell_row = []
            for column in range(columns):
                cell = tk.Label(self, text=f"C{column}R{row}")
                cell.config(bg="#d7e4fb", padx=4, pady=4, width=10)
                cell.grid(row=row, column=column, padx=1, pady=1)
                cell_row.append(cell)
            self.cells.append(cell_row)

class Window(tk.Tk):
    def __init__(self,title="dhd", size="1200x600", bg_color="#181a23"):
        super().__init__()
        self.title(title)
        self.geometry(size)
        self.table = Table(self)
        self.table.pack()


def main():
    app = Window()
    app.mainloop()

if __name__ == '__main__':
    main()
Phraya
User
Beiträge: 11
Registriert: Dienstag 31. März 2020, 15:13

Vielen Dank fur die Hilfe! macht Sinn... Danke!
Antworten