Python, classer och tkinter gui's [LÖST]
Postat: 26 jan 2015, 11:17
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:
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...
Felmeddelande:
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()
Gui körs som det skall, knappar, textrutor och checkboxar fungerar som det skall. Dock inte min Password klass

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
Vad är fel? fattar inte, det är ju samma kod i båda fallen och det fungerar i ena utan gui't...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