web-dev-qa-db-fra.com

Création d'une table d'aspect-a - comme tkinter

Je cherche à créer quelque chose qui ressemble à une table en tkinter, mais cela ne doit pas nécessairement être un.

Je souhaite créer le nom de l'en-têtes1 ',' name2 ',' valeur ', par exemple et en dessous de chacun que je souhaite avoir plusieurs rangées vierges.

Ces lignes souhaitent ensuite remplir plus tard (donc une étiquette) avec des valeurs que j'ai calculées ou des valeurs de chaîne pour les noms.

Pour 'Name2', je voudrais réellement que toute la colonne soit un menu déroulant. J'ai déjà créé le code pour un sur ses propres mais je ne suis pas sûr comment l'incorporer dans cette "table".

Est-ce par exemple possible pour créer une bordure autour d'un widget d'étiquettes, il semble donc une "table"?

Tous les pointeurs vers ce qui serait possible dans cette situation serait très apprécié. Si vous souhaitez que l'un de mes codes ait un coup de travail à quelque chose, demandez simplement. Merci!

12
user2063

Quel problème avez-vous? La solution simple consiste à déposer des widgets en utilisant grid. Vous pouvez mettre le type de widget que vous souhaitez dans chaque cellule. Et oui, les étiquettes peuvent avoir des frontières. Cependant, un moyen simple de faire des lignes de grille est d'utiliser un rembourrage autour de chaque cellule, de sorte que la couleur du cadre montrait à travers les lacunes.

Faites cela dans un cadre. Si vous avez besoin de faire défiler la table, placez le cadre à l'intérieur d'une toile et ajoutez des barres de défilement. Il existe des exemples sur la bande pour créer un cadre défilable à l'aide d'une toile.

Voici un exemple très rapide qui utilise des étiquettes seulement et ne fait pas défiler. Je laisserai la mise en œuvre exacte de ce dont vous avez besoin comme un exercice pour le lecteur.

import Tkinter as tk

class ExampleApp(tk.Tk):
    def __init__(self):
        tk.Tk.__init__(self)
        t = SimpleTable(self, 10,2)
        t.pack(side="top", fill="x")
        t.set(0,0,"Hello, world")

class SimpleTable(tk.Frame):
    def __init__(self, parent, rows=10, columns=2):
        # use black background so it "peeks through" to 
        # form grid lines
        tk.Frame.__init__(self, parent, background="black")
        self._widgets = []
        for row in range(rows):
            current_row = []
            for column in range(columns):
                label = tk.Label(self, text="%s/%s" % (row, column), 
                                 borderwidth=0, width=10)
                label.grid(row=row, column=column, sticky="nsew", padx=1, pady=1)
                current_row.append(label)
            self._widgets.append(current_row)

        for column in range(columns):
            self.grid_columnconfigure(column, weight=1)


    def set(self, row, column, value):
        widget = self._widgets[row][column]
        widget.configure(text=value)

if __name__ == "__main__":
    app = ExampleApp()
    app.mainloop()
36
Bryan Oakley

Une solution d'objet assez simple que j'ai trouvée:

from Tkinter import *

rows = []
for i in range(5):
    cols = []
    for j in range(4):
        e = Entry(relief=RIDGE)
        e.grid(row=i, column=j, sticky=NSEW)
        e.insert(END, '%d.%d' % (i, j))
        cols.append(e)
    rows.append(cols)

def onPress():
    for row in rows:
        for col in row:
            print col.get(),
        print

Button(text='Fetch', command=onPress).grid()
mainloop()

ou

# simple 2d table

from Tkinter import *

for i in range(5):
    for j in range(4):
        l = Label(text='%d.%d' % (i, j), relief=RIDGE)
        l.grid(row=i, column=j, sticky=NSEW)

mainloop()

Tous disponibles à http://www.java2s.com/code/python/gui-tk/

4
HCLivess

Comment créer une table à partir d'un dictionnaire:

my_dict = {
    1: {'Header1': 'Row1_Value1', 'Header2': 'Row1_Value2', 'Header3': 'Row1_Value3', },
    2: {'Header1': 'Row2_Value1', 'Header2': 'Row2_Value2', 'Header3': 'Row2_Value3', },

    }

# Create the header
for column, header in enumerate(my_dict[1]):
    Label(self, text=header).grid(row=0, column=0+column)

# Fill in the values
for row, element in enumerate(my_dict.values()):
    for column, (header, value) in enumerate(element.items()):
        Label(self, text=value).grid(row=1+row, column=0+column)
0
Toby