Tkinter: Jak mám správně nastavit parametry rozšířené Tlačítko třídy?

0

Otázka

Já jsem experimentoval s vytvářením vztahů se zákazníky řízení programu pomocí tkinter a python a chcete mít tlačítka generována na základě tabulek v databázi.

Myšlenka je, že tam je tlačítko pro každou tabulku v databázi, tak, že tabulku lze prohlížet a upravovat v případě potřeby.

Chci mít každé tlačítko vypadají stejně a pokud na něj kliknete, vygeneruje seznam položek tabulky do hlavního rámu mého programu. K tomu chci prodloužit Tlačítko() třídy tak, že můžu mít některé atributy současné chvíli také definování display_items funkce:

class TabButton(Button):

    def __init__(self, *args, **kwargs):
        super().__init__(Button)
        self['bg'] = '#a1a1a1'
        self['font'] = ('Agency', 24)

    def display_items(self, tab):
        pass
        #mycursor.execute('SELECT * FROM (%s)', tab)

Tento poslední řádek (viz výše) je to, co vybere data ze správné tabulky v databázi - já komentoval to, když jsem přijít na to, zbytek třídy. Vím, co *args a **kwargs udělat, ale nejsem si jistý, jaký účel mají v tomto __init__ funkce (nejsem velmi dobře obeznámeni s třídy a zkopíruje tuto třídu z jiného Přetečení Zásobníku post).

Pro generování tlačítek, jsem odkazoval dict instanci a přiřadit každé tlačítko na tlačítko:

tabs = {
    'Table1': '',
    'Table2': '',
    'Table3': '',
}

for tab in tabs:
    row = 0
    tabs[tab] = TabButton(side_frame, command=lambda: TabButton.display_items(tab))
    tabs[tab].grid(row=row, column=0)
    row += 1

Problém je, když jsem spustit program, dostanu tuto chybu:

AttributeError: type object 'Button' has no attribute 'tk'

Veškeré poradenství je vítán!

Pokud si všimnete nějaké chyby v mém kódu, mohl byste prosím upozornit? Velmi jsem se na programování nového, a to mě zachrání, takže další příspěvek na Stack Overflow. :p

Díky, J

crm inheritance parameters python
2021-11-23 20:08:50
1

Nejlepší odpověď

0

Super vrátí dočasný objekt této třídy a přístup k jeho obsahu. Super sám účastník přijmout žádné argumenty. Viz také prupose self v kontextu.

self představuje instance třídy

Často, první argument je volána metoda self. To je nic více než konvence: jméno self nemá absolutně žádný speciální význam Python. Poznámka, nicméně, že tím, že následující úmluvy váš kód může být méně čitelný, aby ostatní Python programátory

Další otázkou je vaše použití lambda. Váš argument tab budou přepsány (pokud to není uložen) tím, že každé iteraci smyčky. Další problém, který možná není úmyslem použít třídu pro tuto metodu si spíše chtějí být calles do instance, pro ně jsem přidal argument, vlastní, aby vaše metoda a změnil lambda využít instance.

import tkinter as tk
tabs = {'Table1': '', 
        'Table2': '',
        'Table3': '',
        }

root=tk.Tk()

class TabButton(tk.Button):
    def __init__(self,master, *args, **kwargs):
        #self is a reference to the instance of that object
        super().__init__(master)#super dosent need a reference
        self['bg'] = kwargs.get('bg','#a1a1a1')
        self['font'] = kwargs.get('font',('Agency', 24))
    def display_items(self,item):
        print(f'{item} to show')
for tab in tabs:
    b = TabButton(root) #returns a reference to that object
    b.configure(command=lambda btn=b, argument=tab:btn.display_items(argument))
    b.pack()

root.mainloop()
2021-11-24 09:11:31

V jiných jazycích

Tato stránka je v jiných jazycích

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................