我试图通过将调用导入新脚本来从另一个脚本调用这三个类变量。这就是它的工作方式,当logIn.py运行时如果输入正确的用户名和密码,它们将保存在用户和密码变量中。如果失败,则将1添加到失败变量中。在第一天,我有这样的fail = 0, user = "", password = ""
因为我得到了未定义的错误。一切都有效,但当我创建该类的对象时,所有内容都再次初始化为fail = 0, user = "", password = ""
。所以我想“也许我可以使用StringVar
和IntVar
来解决问题”。但相反,我得到了这个错误。
Traceback (most recent call last):
File "C:\Users\devilboy 4\Documents\Visual Studio 2013\Projects\mainPage3\mainPage3\logIn_screen.py", line 9, in <module>
class checkValidation:
File "C:\Users\devilboy 4\Documents\Visual Studio 2013\Projects\mainPage3\mainPage3\logIn_screen.py", line 11, in checkValidation
fail = IntVar()
File "C:\Python31\lib\tkinter\__init__.py", line 265, in __init__
Variable.__init__(self, master, value, name)
File "C:\Python31\lib\tkinter\__init__.py", line 174, in __init__
self._tk = master.tk
AttributeError: 'NoneType' object has no attribute 'tk'
我很确定它与String,IntVar
有关。如果这样做正常,在mainPage3上我将生成一个报告,这3个变量是我将要使用的变量。
logIn_screen.py:
from tkinter import *
import os
import tkinter.messagebox
#check si lo entrado es correcto
class checkValidation:
fail = IntVar()
user = StringVar()
password = StringVar()
#valida el user y el pass
def fullVali(self, name, passwd):
if name == "" or name == " ":
tkinter.messagebox.showinfo( "Error","Dejo el usuario en blanco")
self.fail+= 1
elif name != "UmetSeg":
tkinter.messagebox.showinfo( "Error","Usuario incorrecto")
self.fail+= 1
else :
self.user = name
tkinter.messagebox.showinfo( "ok","dude" + name)
if passwd == "" or passwd == " ":
tkinter.messagebox.showinfo( "Error","Dejo la password en blanco")
self.fail+= 1
elif passwd != "SegUmet":
tkinter.messagebox.showinfo( "Error","Password incorrecto")
self.fail+= 1
else :
self.password = passwd
tkinter.messagebox.showinfo( "ok","dude" + passwd)
form.destroy()
#open another py script
os.system("mainPage3.py 1")
return
# no deja pasar parametros por command en el boton a menos que se por lambda, so corre este metodo para
#correr el metodo de validar
def callVali(self):
user = usrIn.get()
self.fullVali(usrIn.get(), passIn.get())
return
def getUser(self):
return self.user
def getPass(self):
return self.password
#este if es para que corra esto si se corre el programa y no si se importa la clase
if __name__ == "__main__":
vali = checkValidation()
form = Tk()
form.title("LogIn")
form.geometry("300x320+300+200")
#User txtBox
usrIn = Entry(form, textvariable = None, width = 30)
usrIn.place(x = 60, y = 140)
user = usrIn.get()
#Passwd txtBox - show es para que se vea eso pero el texto sea lo que se escribe
passIn = Entry(form, show = "*", textvariable = None, width = 30)
passIn.place(x = 60, y = 200)
#Username Label
usrLblVal = StringVar()
usrLblVal.set("User name")
usrLbl = Label(form, textvariable = usrLblVal )
usrLbl.place(x = 120, y = 115)
#Passwrd label
passLblVal = StringVar()
passLblVal.set("Password")
passLbl = Label(form, textvariable = passLblVal )
passLbl.place(x = 120, y = 175)
#Login btn
btn = Button(form, text = "Entrar", width = 10, command = vali.callVali)
btn.place(x = 110, y = 250)
form.mainloop()
mainPage3.py(我从logIn_screen.py导入类):
from tkinter import *
from logIn_screen import checkValidation
import os
import time
import tkinter.messagebox
#stuff to do:
#seguir el formato hechoen writeFile.py
#bregar con lo de procesar imagenes
#cambiar los botones de help, reporte y logout por imagenes enves de texto
#ponerle un background image a todo para que se vea mas bonito
#Reporte shit:
#se genera un reporte cadavez que se hace un fail attempt a entrar en el login, cadavez que se abre esta pagina(con hora fecha y dia),
#cada vez que se presiona editar(sale el valor), cadavez que se captura y se presiona Si(sale el resultado) o No y cadavez que se presione logOut(sale fecha y hora) .
#seguir con el reporte.
#tiene todos los metodos que bregan con agregar widgets y quitarlos
class formManipulation:
# total default de parkings
tot = 200
# 0 = no 1 = yes
totChanged = 0
cv = checkValidation()
# 0 = no 1 = yes
imgAceptada = 1
#tiempo con formato 12
t1 = time.strftime("%I:%M%p")
#fecha
d1 = time.strftime("%d-%m-%Y")
# tiempo cuando se undio logOut
#t2 = ""
##fecha al undirse logOut
#d2 = ""
#corre cuando se unde actualizar y cambia el valor de parking en total
def changeTotal(self, txt):
self.totChanged = 1
if txt == "" or txt == " ":
tkinter.messagebox.showinfo( "Error","Dejo el total de estacionamientos en blanco")
else:
try:
self.tot = int(txt)
except:
tkinter.messagebox.showinfo( "Error","El valor debe ser numerico")
if self.tot < 1:
tkinter.messagebox.showinfo( "Error","El valor debe ser mayor a cero")
else:
self.tot = str(self.tot)
#se usa para llamar changeTotal(self, txt) por que esta mierda no se le pueden pasar parametros por el command del buton
def callChange(self):
self.changeTotal(txtBoxPark.get())
#el form peque~o(no puedo usar e~e ni que sale un error...) que sale despues de presionar capturar
def askForm(self):
self.imgAceptada = 1
#display new form
form2 = Tk()
form2.title("Cotego de imagen")
form2.geometry("300x100")
newBox = LabelFrame(form2, text = "La imagen es correcta?", height = "50", width = "250")
newBox.place(x = 30, y = 17)
#btn Si
btnY = Button(newBox, text = "Si", width = 3, command = self.changeDisTxt)
btnY.place( x = 50)
#btn No
btnN = Button(newBox, text = "No", width = 3, command = self.killImg)
btnN.place(x = 150)
#display la cantidad sobrante de parkings de acuerdo al total en el txtBox de estacionamientos
def changeDisTxt(self):
#puse esto aqui envez de en la classe de reporte por que pasar parametros
#por widgets de tkinter es una jodienda.
with open(self.d1 + ".txt", "a+") as f:
f.write("--Imagen capturada-- \r\n\r\n"+
"Correcta: Si\r\n\r\n" +
"Path de la imagen: \r\n\r\n" +
"Disponibilidad: 50/"+ self.tot + "\r\n\r\n" +
self.d1 + " " + self.t1 + "\n" +
"--------------------------------\r\n\r\n")
if self.imgAceptada > 0:
txtBoxDisp.insert(0, "50/" + self.tot)
txtBoxDisp.configure(state = "readonly")
else:
tkinter.messagebox.showinfo( "Error","Debe capturar una nueva imagen")
#desaprace la foto
def killImg(self):
#puse esto aqui envez de en la classe de reporte por que pasar parametros
#por widgets de tkinter es una jodienda.
with open(self.d1 + ".txt", "a+") as f:
f.write("--Imagen capturada-- \r\n\r\n"+
"Correcta: No\r\n\r\n" +
"Path de la imagen: \r\n\r\n" +
self.d1 + " " + self.t1 + "\n" +
"--------------------------------\r\n\r\n")
self.imgAceptada = 0
lblImg.pack_forget()
#display la foto
def displayImg(self):
lblImg.pack()
self.askForm()
#llama al script que desplega el howTo
def openHelp(self):
os.system("howTo.py 1")
#grava la fecha y tiempo que se presiono logOut y abre el script de logIn
def openLogIn(self):
#tiempo con formato 12
t2 = time.strftime("%I:%M%p")
#fecha
d2 = time.strftime("%d-%m-%Y")
failStr = str(self.cv.fail)
totStr = str(self.tot)
with open(self.d1 +".txt", "a") as f:
f.write("--Reporte Final-- \r\n\r\n"+
"Entrada: "+ self.d1 + " " + self.t1 +" \r\n" +
"Intentos fallados: " + failStr + " \r\n" +
"Usuario: " + self.cv.user + " \r\n" +
"Total de estacionamientos: " + totStr + " \r\n" +
"Promedio de estacionamientos libres: 50% \r\n" +
"Salida: " + d2 + " " + t2 +"\r\n" +
"--------------------\r\n\r\n"
)
form.destroy()
os.system("logIn_screen.py 1")
# clase que brega con todo lo que tenga que ver con el reporte
class ReportGen():
fm = formManipulation()
cv = checkValidation()
#mainLog = ""
#desplega el form del reporte y lee el file de reportes
def repForm(self):
#form
form3 = Tk()
form3.title("Parkaider")
form3.geometry("500x500")
with open(fm.d1 + ".txt") as f:
out = f.read()
repBox = LabelFrame(form3, text = "Reporte generado", height = 420, width = 260)
repBox.place( x = 30, y = 10)
scroll = Scrollbar(repBox)
scroll.pack( side = RIGHT, fill = Y)
txt = Text(repBox, text = None, yscrollcommand = scroll.set)
txt.insert(END, out)
txt.config( width = 50, height = 28)
txt.pack()
txt.config( state = DISABLED)
scroll.config(command = txt.yview)
#genera reporte cuando se actualiza el valor de estacionamientos
def totUpdateLog(self):
fm.callChange()
with open(fm.d1 + ".txt", "a+") as f:
f.write("--Total de parking actualizado-- \r\n\r\n"+
"Total de estacionamientos : "+ fm.tot +"\r\n\r\n" +
fm.d1 + " " + fm.t1 + "\n" +
"--------------------------------\r\n\r\n")
#llama al metodo de logout y genera el reporte final
def finRep():
fm.openLogIn()
#class PicProcessing:
#main form
fm = formManipulation()
rg = ReportGen()
global form
form = Tk()
form.title("Main Page")
form.geometry("600x700+100+0")
#box imagen capturada
#esta aqui por que sino sale undefined para lblImg
imgBox = LabelFrame(form, text = "Imagen capturada", height = "300", width = "260")
#path de foto
#esta aqui por que sino sale undefined para lblImg
img = PhotoImage(file = "parking.gif", height = "300", width = "260")
#foto
#es global para que la pueda reconocer la clase cuando corra killImg()
global lblImg
lblImg = Label(imgBox, image = img)
#big lbl PArkaider
lblTitleVal = StringVar()
lblTitleVal.set("Parkaider")
lblTitle = Label(form, textvariable = lblTitleVal, font=("Times", 30))
lblTitle.place( x = 220, y = 20)
#total de parking. Se convierte en string para usarse en el txtBox
strinTot = StringVar()
#conversion de totPark(int) a string
fm.tot = str(fm.tot)
#txtBox con el total de parking.
txtBoxPark = Entry(form, textvariable = None, width = 10)
txtBoxPark.insert(0,fm.tot)
txtBoxPark.place( x = 264, y = 135)
#lbl total de estacionamientos
lblParkingTotVal = StringVar()
lblParkingTotVal.set("Total de estacionamientos")
lblParkingTot = Label(form, textvariable = lblParkingTotVal, font = ("Times"))
lblParkingTot.place( x = 220, y = 100)
#btn edit,se usa si se fuera hacer update al algoritmo con el total nuevo de parking que no sea el default
btnEditTot = Button(form, text = "Actualizar", width = 8, command = rg.totUpdateLog)
btnEditTot.place( x = 263 , y = 170 )
#show el box de imagen capturada
imgBox.place(x = 170, y = 220)
#txtBox con la cantidad total despues que confirma que la imagen es correcta. Se supo que ahi se haga el algoritmo de object detection
txtBoxDisp = Entry(form, textvariable = None, width = 30)
txtBoxDisp.place( x = 210, y = 650)
#btn que captura una imagen con la camara
btnCap = Button(form, text = "Capturar" , width = 7, command = fm.displayImg)
btnCap.place( x = 270, y = 550)
#lbl disponibilidad
lblDisVal = StringVar()
lblDisVal.set("Disponibilidad")
lblDis = Label(form, textvariable = lblDisVal, font = "Times")
lblDis.place( x = 255, y = 620)
btnHelp = Button(form, text = "help", width = 4, command = fm.openHelp)
btnHelp.place(x = 20, y = 20)
btnLogout = Button(form, text = "Logout", width = 5, command = fm.openLogIn)
btnLogout.place(x = 540, y = 20)
btnRep = Button(form, text = "Reporte", width = 6, command = rg.repForm)
btnRep.place( x = 70, y = 20 )
#se necesita para que todo funcione en windows, en linux o mac, esto no hace falta
form.mainloop()
忽略所有西班牙语评论和Spanglish变量lol。
由于
答案 0 :(得分:1)
您必须创建根窗口才能创建StringVar
或IntVar
答案 1 :(得分:1)
在类声明之前和导入的类
之前放置form = Tk()
global form
form = Tk()
from logIn_screen import checkValidation
class formManipulation:
# rest of code