Python, classer och tkinter gui's [LÖST]

Här diskuteras programmering och utveckling
Användarvisningsbild
ZerQ
Inlägg: 160
Blev medlem: 01 aug 2007, 08:40
OS: Annat GNU/Linux
Ort: Ornsköldsvik
Kontakt:

Python, classer och tkinter gui's [LÖST]

Inlägg av ZerQ »

hej

Har skrivit en enklare program i Python 3.4 som tar fram lösenord, detta är gjort med en Klass och metoder i klassen. Detta fungerar bra och allting skrivs ut både till python shellen och till filen, se kod nedan:

Kod: Markera allt

# Password program using classes
# imported modules
import os, time
import random as R
import datetime as DT

# Stativ variabes used
spList = [33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 58, 59, 60, 61, 62, 63, 64,
          91, 92, 93, 94, 95, 123, 124, 125, 126]

# Class definitions
class Password:
    '''This class creates an password object'''

    def __init__(self, length, numbersVal, specialVal, labelVal, label):
        self.lth = length
        self.nrVal = numbersVal
        self.spVal = specialVal
        self.lbVal = labelVal
        self.label = label

    def createPass(self):
        self.passList = []
        iterator = 1
        while(iterator <= int(self.lth)):
            r = R.randrange(1, 4)
            if(r == 1 and self.nrVal == 1):
                self.passList.append(self.numbersAdd())
            elif(r == 2 and self.spVal == 1):
                self.passList.append(self.specialAdd())
            elif(r == 3):
                self.passList.append(self.charsAdd())

            if(iterator <= len(self.passList)):
                iterator += 1
        return self.passList

    def numbersAdd(self):
        return R.randrange(0, 9)

    def specialAdd(self):
        return chr(spList[R.randrange(0, 31)])

    def charsAdd(self):
        r1 = chr(R.randrange(97, 123))
        r2 = chr(R.randrange(65, 91))
        r3 = R.randrange(1, 3)
        if(r3 == 1):
            return r1
        elif(r3 == 2):
            return r2
        else:
            print("Nu vart det fel...")
            
    def writeToFile(self):
        f = open("pwd-lista.txt", "a")
        d = DT.datetime.now()
        f.write("\nSkapat den ")
        f.write("{:%Y-%m-%d klockan: %H:%M:%S}, ".format(d))
        if(p.lbVal == 1):
            f.write("Lösenord till ")
            f.write(p.label)
            f.write(": ")
        for i in range(len(p.passList)):
            f.write(str(p.passList[i]))
        f.close()
        
# Main loop code
p = Password(10, 1, 1, 1, "Harlem shaker")
print(p.createPass())
print(p.passList)
p.writeToFile()
Nu till det som gör mig förbryllad. Jag har efter det skapat en tkinter gui som ska ta denna klass och göra det enklare för en användare att använda det.
Gui körs som det skall, knappar, textrutor och checkboxar fungerar som det skall. Dock inte min Password klass :( Se kod och felmeddelande nedan...

Kod: Markera allt

# Password program using classes and GUI TKinter
# Import modules
import os, time
import random as R
import datetime as DT
from tkinter import * 
from tkinter import ttk

# Static variables
spList = [33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 58, 59, 60, 61, 62, 63, 64,
          91, 92, 93, 94, 95, 123, 124, 125, 126]

# Class definitions
class Password:
    '''This class creates an password object'''

    def __init__(self, length, numbersVal, specialVal, labelVal, label):
        self.lth = length
        self.nrVal = numbersVal
        self.spVal = specialVal
        self.lbVal = labelVal
        self.label = label
        
    def createPass(self):
        self.passList = []
        iterator = 1
        while(iterator <= self.lth):
            r = R.randrange(1, 4)
            if(r == 1 and self.nrVal == 1):
                self.passList.append(self.numbersAdd())
            elif(r == 2 and self.spVal == 1):
                self.passList.append(self.specialAdd())
            elif(r == 3):
                self.passList.append(self.charsAdd())

            if(iterator <= len(self.passList)):
                iterator += 1
        return self.passList
        
    def numbersAdd(self):
        return R.randrange(0, 9)

    def specialAdd(self):
        return chr(spList[R.randrange(0, 31)])

    def charsAdd(self):
        r1 = chr(R.randrange(97, 123))
        r2 = chr(R.randrange(65, 91))
        r3 = R.randrange(1, 3)
        if(r3 == 1):
            return r1
        elif(r3 == 2):
            return r2
            
    def writeToFile(self):
        f = open("pwd-lista.txt", "a")
        d = DT.datetime.now()
        f.write("\nSkapat den ")
        f.write("{:%Y-%m-%d klockan: %H:%M:%S}, ".format(d))
        if(p.lbVal == 1):
            f.write("Lösenord till ")
            f.write(p.label)
            f.write(": ")
        for i in range(len(p.passList)):
            f.write(str(p.passList[i]))
        f.close()

 # Functions for TK widgets
def exitGUI():
    root.destroy()

def clearWidgets(*args):
    lengthOfPass_entry.delete(0, 7)
    labelPass_entry.delete(0, 25)
    numVal.set(0)
    specVal.set(0)
    labVal.set(0)
    
def createPassObject(*args):
    lth = int(lengthOfPass.get())
    nVal = numVal.get()
    sVal = specVal.get()
    lVal = labVal.get()
    lb = labelPass.get()
    p = Password(lth, nVal, sVal, lVal, lb)
    p.writeToFile()
            
# Define Tkinter frame
root = Tk()
root.title("ZerQ's Lösenords generator")

# These lines are for resizing frame
mainframe = ttk.Frame(root, padding = "3 3 12 12")
mainframe.grid(column = 0, row = 0, sticky = (N, W, E, S))
mainframe.columnconfigure(0, weight = 1)
mainframe.rowconfigure(0, weight = 1)

# Create and use textfields
lengthOfPass = IntVar()
labelPass = StringVar()
numVal = IntVar()
specVal = IntVar()
labVal = IntVar()

lengthOfPass_entry = ttk.Entry(mainframe, width = 6, textvariable = lengthOfPass)
lengthOfPass_entry.grid(column = 1, row = 0, sticky = W)
lengthOfPass_entry.delete(0, 10)
lengthOfPass_entry.insert(10, 8)

labelPass_entry = ttk.Entry(mainframe, width = 25, textvariable = labelPass)
labelPass_entry.grid(column = 0, row = 4, sticky = W)
labelPass_entry.insert(10, "Etikett...")

# Objekts in mainframe, buttons labels and checkboxes
ttk.Label(mainframe, text = "Antal tecken i lösenordet (4 till 255)?").grid(column = 0, row = 0, sticky = W)

ttk.Label(mainframe, text = "Siffror i lösenordet? ").grid(column = 0, row = 1, sticky = W)
numbersVal_checker = ttk.Checkbutton(mainframe, text = " Ja", variable = numVal).grid(column = 1, row = 1, sticky = W)

ttk.Label(mainframe, text = "Specialtecken i lösenordet? ").grid(column = 0, row = 2, sticky = W)
specialVal_checker = ttk.Checkbutton(mainframe, text = " Ja", variable = specVal).grid(column = 1, row = 2, sticky = W)

ttk.Label(mainframe, text = "Vill du ha en etikett för lösenordet? ").grid(column = 0, row = 3, sticky = W)
labelVal_checker = ttk.Checkbutton(mainframe, text = " Ja", variable = labVal).grid(column = 1, row = 3, sticky = W)

ttk.Button(mainframe, text = "Skapa lösen", command = createPassObject).grid(column = 6, row = 0, sticky = E)
ttk.Button(mainframe, text = "Rensa fält", command = clearWidgets).grid(column = 6, row = 1, sticky = E)
ttk.Button(mainframe, text = "Avsluta", command = exitGUI).grid(column = 6, row = 2, sticky = E)

for child in mainframe.winfo_children(): child.grid_configure(padx = 5, pady = 5)

lengthOfPass_entry.focus()

# Main loop
root.mainloop()#!/usr/bin/env python
Felmeddelande:
Exception in Tkinter callback
Traceback (most recent call last):
File "/usr/lib/python3.4/tkinter/__init__.py", line 1490, in __call__
return self.func(*args)
File "/home/johnny/Dokument/Python/wxWidget/password-tinker.py", line 88, in createPassObject
p.writeToFile()
File "/home/johnny/Dokument/Python/wxWidget/password-tinker.py", line 62, in writeToFile
if(p.lbVal == 1):
NameError: name 'p' is not defined
Vad är fel? fattar inte, det är ju samma kod i båda fallen och det fungerar i ena utan gui't...
Senast redigerad av 1 ZerQ, redigerad totalt 26 gånger.
gusnan
Inlägg: 343
Blev medlem: 17 jan 2007, 08:20
OS: Debian
Utgåva: Vet inte/ingen utgåva passar

Re: Python, classer och tkinter gui's

Inlägg av gusnan »

Jag är lååååångt ifrån någon Python-expert, men -

Vad händer om du ändrar från p. till self. i writeToFile-metoden? Det ser ut som om du är ute efter klass-medlemmar från Password-klassen men använder dig av "p", som endast är deklarerad utanför klassen.

Som sagt, jag är inte någon Python-expert, men det skulle möjligen kunna vara det som är problemet. (Jag har dock inte testat koden själv).

alltså:

Kod: Markera allt

if(p.lbVal == 1):
bör vara

Kod: Markera allt

if(self.lbVal == 1):
, och liknande på följande p. i den metoden.
Hade tidigare nicket "Cowboy".
Användarvisningsbild
ZerQ
Inlägg: 160
Blev medlem: 01 aug 2007, 08:40
OS: Annat GNU/Linux
Ort: Ornsköldsvik
Kontakt:

Re: Python, classer och tkinter gui's [LÖST]

Inlägg av ZerQ »

gusnan skrev:Jag är lååååångt ifrån någon Python-expert, men -

Vad händer om du ändrar från p. till self. i writeToFile-metoden? Det ser ut som om du är ute efter klass-medlemmar från Password-klassen men använder dig av "p", som endast är deklarerad utanför klassen.

Som sagt, jag är inte någon Python-expert, men det skulle möjligen kunna vara det som är problemet. (Jag har dock inte testat koden själv).

alltså:

Kod: Markera allt

if(p.lbVal == 1):
bör vara

Kod: Markera allt

if(self.lbVal == 1):
, och liknande på följande p. i den metoden.
Just nu är du den Python experten jag behövde :D, måste lära mig mer om hur man anropar en metod i en klass utifrån, det knepiga som ajg funderar över då är varför det fungerar i första utan tkinter delen...

Jaja tackar så mycket :D
Skriv svar

Återgå till "Programmering och webbdesign"