2017-07-19 1 views
-3

Ich habe versucht, Programm für Bibliothek Management-System zu schreiben Ich verwende tkinter-Modul dafür. Ich habe den folgenden Code geschrieben, aber wenn ich versuche, mehrere Textfelder zu erstellen, erhalte ich einen Fehler.Tkinter Modul Error Erroe erstellen Login-Seite in Calss pageone

File "Hope_work.py", line 22, in __init__ 
    frame = F(container, self) 
    File "Hope_work.py", line 62, in __init__ 
    pwd_lable.pack() 
UnboundLocalError: local variable 'pwd_lable' referenced before assignment 

Im Folgenden finden Sie das komplette Programm-I-Fehler in PageOne Klasse bin immer

import tkinter as tk 
import os 
LARGE_FONT= ("Verdana", 12) 
class Myprogramapp(tk.Tk): 
    def __init__(self, *args, **kwargs): 

     tk.Tk.__init__(self, *args, **kwargs) 
     container = tk.Frame(self) 
     container.pack(side="top", fill="both", expand = True) 
     container.grid_rowconfigure(0, weight=1) 
     container.grid_columnconfigure(0, weight=1) 
     self.frames = {} 
     for F in (StartPage, PageOne): 
      frame = F(container, self) 
      self.frames[F] = frame 

      frame.grid(row=0, column=0, sticky="nsew") 
     self.show_frame(StartPage) 
def show_frame(self, cont): 
     frame = self.frames[cont] 
     frame.tkraise() 
class StartPage(tk.Frame): 
    def __init__(self, parent, controller): 
     tk.Frame.__init__(self,parent) 
     label = tk.Label(self, text="Library Managment System", font=LARGE_FONT) 
     label.pack(pady=10,padx=10) 
     button = tk.Button(self, text="Admin Login", 
             command=lambda: controller.show_frame(PageOne)) 
     button.pack() 
     button1 = tk.Button(self, text="Lib Login") 
     button1.pack() 
class PageOne(tk.Frame): 
    def __init__(self, parent, controller): 
     tk.Frame.__init__(self, parent) 
     name_label = tk.Label(self, text="User ID : ") 
     pwd_label = tk.Label(self.name_lable, text="Password:") 
     name_label.pack(pady=10,padx=10) 
     pwd_lable.pack(pady=10,padx=10) 
     name_lable = tk.Entry(self) 
     pwd_lable = tk.Entry(self, show="*") 
     name_lable.pack() 
     pwd_lable.pack() 
     button1 = tk.Button(self, text="Login") 
     button1.pack() 
if __name__ == "__main__": 
    app = Myprogramapp() 
    app.mainloop() 

**

+0

Sie haben hier einige Probleme. Eindeutigkeit für einen, die Schreibweise für Labelnamen ist aufgrund von Rechtschreibfehlern fehlgeschlagen. Sie erstellen das 'pwd_label', das einem anderen Widget anstelle eines Rahmens oder des Stammfensters zugewiesen ist. Deine Klassen sind auf seltsame Weise aufgebaut und ich denke nicht, dass sie so funktionieren werden. Versuchen Sie, alles in eine Klasse einzuordnen, das wäre hier sinnvoller. Für jedes der Widgets, mit denen Sie arbeiten/aktualisieren, müssen Sie sie als Klassenattribute setzen, indem Sie das Präfix 'self' verwenden. –

+0

Der Code, den Sie gepostet haben, gibt nicht den Fehler, den Sie sagen. –

+0

@SierraMountainTech: Das Code-Design kam entweder direkt oder indirekt von http://StackOverflow.com/Questions/7546050. Leider hat jemand es kopiert, ohne es zu verstehen, hat ein Video-Tutorial erstellt, aber ohne es richtig zu erklären, und jetzt verwenden viele Anfänger dieses als Startvorlage. _sigh_ –

Antwort

0

Es scheint, dass Sie mehr abzubeißen versuchen, als Sie so kauen kann sprechen mit diesem Beispiel von Code. Sie vermissen Teile von TKinter, die Sie verstehen sollten, bevor Sie sich auf etwas Komplizierteres wie dieses begeben.

Bevor Sie versuchen, mehrere Klassen wie diese zu verwenden, versuchen Sie mehr zu verstehen, wie tkinter funktioniert und wie Sie alle seine Widgets in einer Klasse oder sogar außerhalb einer Klasse korrekt implementieren.

Sie weisen keine Widgets auf ein anderes Widget, wie Sie hier zu tun versuchen:

pwd_label = tk.Label(self.name_lable, text="Password:") 

Das ist das Problem in Ihrem Trackbacks gepfiffen hat. Sie müssen das Label-Widget entweder einem Stammfenster, einem Frame oder einem Toplevel zuweisen.

Ihr Einzug ist nicht sauber und wenn die Art, wie Sie es in Ihre Frage eingefügt haben, genau ist, dann funktioniert der Code nicht, da die def show_frame()-Methode nicht in der Myprogramapp-Klasse ist.

Sie importieren os ohne Grund hier und es ist keine gute Praxis, Bibliotheken zu importieren, die Sie gerade nicht verwenden.

Sie sollten einige wichtige Teile Ihres Programms in ein Klassenattribut wie Ihre Eingabefelder machen. Wenn Sie ein Passwort in dieses Feld eingeben und get() die Zeichenfolge aus dem Eingabefeld innerhalb einer Methode versuchen, können Sie nicht als Klassenattribut. Sie können dies beheben, indem Sie dem Widgetnamen das Präfix self. hinzufügen.

Alle und alle nach diesen Änderungen erhalten Sie ein Tkinter-Fenster mit 2 Tasten. Die Schaltfläche Admin Login zeigt einen Anmeldebildschirm an. Davon abgesehen denke ich, dass Sie entweder beim Lernen von tkinter aus dem Unterricht aussteigen sollten oder erst einmal in einer einzelnen Klasse arbeiten sollten, bis Sie ein solides Verständnis davon haben, wie Klassen, Methoden und Attribute funktionieren und verwendet werden.