2017-09-26 3 views
1

ich die Warnung in Frage für den folgenden Code erhalten:Python - Instanz Attribut außerhalb __init __() definiert

from tkinter import * 
from tkinter import ttk 


class Autocomplete(Frame, object): 
    def __init__(self, *args, **kwargs): 
     super(Autocomplete, self).__init__(*args, **kwargs) 
     self.list = [] 

    def build(self, width, height, entries): 
     # I get the warning for the following 8 lines: 
     self._entries = entries 
     self.listbox_height = height 
     self.entry_width = width 
     self.text = StringVar() 
     self.entry = ttk.Entry(self, textvariable=self.text, width=self.entry_width) 
     self.frame = Frame(self) 
     self.listbox = Listbox(self.frame, height=self.listbox_height, width=self.entry_width) 
     self.dropdown = Listbox(self.frame, height=self.listbox_height, width=self.entry_width, background="#cfeff9", 
           takefocus=0) 
     self.entry.pack() 
     self.frame.pack() 
     self.listbox.grid(column=0, row=0, sticky=N) 
     self.dropdown.grid(column=0, row=0, sticky=N) 
     self.dropdown.grid_forget() 
     return self 
root = Frame(Tk()) 
autocomplete = Autocomplete(root).build(74, 10, entries) 
root.pack() 
autocomplete.pack() 
mainloop() 

Wie soll ich dieses Problem beheben? Ich habe versucht, alles auf init zu verschieben, aber dann hatte ich einige Fehler, um die Argumente in der Zeile zu übergeben, in der ich das Autocompelete-Objekt erstellte. Also bitte geben Sie mir alle Änderungen, die ich machen muss. nicht nur, als müßtest du sie bewegen. Ich könnte die Warnung beheben, indem ich 8 Definitionszeilen hinzufüge, die allen Variablen None zuweisen, aber ich denke, das ist eine so dumme Lösung. Was ist also richtig?

+2

* „Ich durch Zugabe von 8 Definitionszeilen zuweisen Keine alle Variablen, um die Warnung beheben könnte“ * ... das ist was dir die Warnung sagt. Das plötzliche Auftreten von Attributen auf einem Objekt, die nicht in der Methode "__init__" definiert wurden, kann das Debugging erschweren. – CoryKramer

+0

auch, das ist ziemlich stark abhängig von der Linter Sie verwenden. – turbulencetoo

+0

@turbulenztool Ich benutze pycharm –

Antwort

2

Es ist immer wichtig zu bedenken, dass nicht alle Warnungen repariert werden müssen. Warnungen sind nur Warnungen. Sie sollen auf einen bestimmten Teil des Codes hinweisen, da es sich um eine "häufige" Problemquelle handelt. Aber manchmal musst/willst du es so machen.

ich die Warnung durch Zugabe von 8 Definitionszeilen zuweisen Keine alle Variablen beheben könnte

Das gerade ist die Warnungen, meiner Meinung nach „zum Schweigen zu bringen“, die als ignoriert die Warnungen nur so gut sind.

Also was ist das Richtige zu tun?

Der richtige Weg wäre nur __init__ zu verwenden. Ich habe einen schnellen Test gemacht und ich habe keine Probleme.

Aber das ist nur ein Beispiel, wie man es machen könnte. Ich habe nicht geprüft, welche Frame will als Argument für __init__ so könnte es zu Konflikten führen:

from tkinter import * 
from tkinter import ttk 

class Autocomplete(Frame, object): 
    def __init__(self, *args, **kwargs): 
     width, height, entries = kwargs.pop('width'), kwargs.pop('height'), kwargs.pop('entries') 
     super(Autocomplete, self).__init__(*args, **kwargs) 
     self.list = [] 
     self._entries = entries 
     self.listbox_height = height 
     self.entry_width = width 
     self.text = StringVar() 
     self.entry = ttk.Entry(self, textvariable=self.text, width=self.entry_width) 
     self.frame = Frame(self) 
     self.listbox = Listbox(self.frame, height=self.listbox_height, width=self.entry_width) 
     self.dropdown = Listbox(self.frame, height=self.listbox_height, width=self.entry_width, background="#cfeff9", 
           takefocus=0) 
     self.entry.pack() 
     self.frame.pack() 
     self.listbox.grid(column=0, row=0, sticky=N) 
     self.dropdown.grid(column=0, row=0, sticky=N) 
     self.dropdown.grid_forget() 

root = Frame(Tk()) 
autocomplete = Autocomplete(root, width=74, height=10, entries=entries) 
root.pack() 
autocomplete.pack() 
mainloop() 
+0

Danke mein Problem war mit nicht hinzufügen, Breite, Höhe, Einträge = kwargs.pop ('Breite'), kwargs.pop ('Höhe'), kwargs.pop ('Einträge')! Ich wusste nicht, was Kwargs sind, und ich bekam Fehler bc davon. Danke. –

Verwandte Themen