BUTTON NOT SUBMITING DATA - python

I'm creating a GUI and I had an issue. My GUI is going to interact with the users, so when the user's inputs are written they have to be saven in a variable. I created a button to do this submition, but it's not working. The problem is in the sg.Button('SubmitData', visible=False) Does anyone knows why?
This is my code:
def window():
# Definindo o fundo da tela como preto
sg.theme('Black')
# Declarando o logo da mercedes
myImg = sg.Image(filename='logo_meca_pret.png',size=(200,200))
# Declarando os outputs
output = sg.Text(font=("Arial",20),key="output")
output2 = sg.Text(font=("Arial",20),key="output2")
output3 = sg.Text(font=("Arial",20),key="output3")
output4 = sg.Text(font=("Arial",20),key="output4")
layout = [
[myImg,sg.Text('PROGRAMA DE TREINAMENTOS',font=("Arial",60),justification="center")],
[sg.Text("Passe o cracha no leitor: ",font=("Arial",20)),sg.InputText(size=(60),key="ID")],
[sg.Text("Escreva seu nome: ",font=("Arial",20),visible=False,key="NAMETEXT"),sg.InputText(size=(60),visible=False,key="NAME")],
[sg.Text("Digite seu setor(111/112/113): ",font=("Arial",20),visible=False,key="SECTIONTEXT"),sg.Input(size=(5),visible=False,key="SECTION")],
[sg.Button('SubmitData', visible=False)],
[output],
[output2],
[output3,sg.InputText(size=(1),key="w_a",visible=False)],
[output4],
[sg.Text("CLIQUE NO BOTAO PARA ABRIR AS TELAS DOS TUTORIAIS",font=("Arial",30),visible=False,key="BOTAOW3"),sg.Button("W3",visible=False)],
[sg.Button('Submit', visible=False, bind_return_key=True)]
]
window = sg.Window('PROGRAMA DE TREINAMENTOS MERCEDES BENZ', layout,element_justification="center").Finalize()
window.Maximize()
while True:
event, values = window.read()
if event == sg.WIN_CLOSED or event == 'Cancel': # if user closes window or clicks cancel
break
#print('You entered ', values[0])
if event == 'Submit':
ID = values["ID"]
ID = ID.upper()
if is_registered(ID) == True:
name,section = current_user_data(users_df,ID)
output.update(f"Ola, {name}, bem vindo ao programa de treinamento Mercedes Benz Brasil!\n")
videos = videos_to_watch(section,ID)
if is_list_empty(videos,section,ID) == True:
output2.update("Nao ha novos tutoriais disponiveis.")
output3.update("Deseja assistir algum tutorial novamente (S/N)?")
window['w_a'].update(visible = True)
w_a = values["w_a"]
if w_a == "s" or w_a == "S":
# abre a tela com todos os tutoriais da pasta daquela secao
window2()
if w_a == "n" or w_a == "N":
# usa esses comandos para limpar a tela, para que um novo usuario use
window.find_element("ID").update("")
window.find_element("output").update("")
window.find_element("output2").update("")
window.find_element("output3").update("")
window.find_element("w_a").update("")
window['w_a'].update(visible = False) # deixa o input do w_a invisivel de novo
window.find_element("output4").update("")
else:
# se tiverem videos a serem assistidos abrir a WINDOW3
window["BOTAOW3"].update(visible = True)
window["W3"].update(visible = True)
if event == "W3":
# window3()
print("lalala")
else:
window["NAMETEXT"].update(visible = True)
window["NAME"].update(visible = True)
window["SECTIONTEXT"].update(visible = True)
window["SECTION"].update(visible = True)
window["SubmitData"].update(visible = True)
if event == 'SubmitData' :
name = values["NAME"]
name = name.title()
section = values["SECTION"]
output.update(f"Ola, {name}, bem vindo ao programa de treinamento Mercedes Benz Brasil!\n")
The output that I want is:
OUTPUT IMAGE

Related

Raspberry pi OpenCV | GStreamer warning: Cannot query video position: status=0, value=-1, duration=-1", can anyone help me?

I'm developing the code below in a raspberry pi 4 to detect cars, but I'm having trouble "[ WARN:0#1.169] global /home/pi/opencv/modules/videoio/src/cap_gstreamer.cpp (1405) open OpenCV | GStreamer warning: Cannot query video position: status=0, value=-1, duration=-1", can anyone help me? i j tried to reinstall opencv a few times and update gstreamer but haven't had positive results yet
import cv2
import numpy as np
from datetime import date
import argparse
# Parâmetros auxiliares iniciais (fonte para textos e cores em BGR)
fonte_textos = cv2.FONT_HERSHEY_SIMPLEX
tamanho_texto = 0.4
cor_texto = (255,255,255)
cor_grade = (255,255,255)
cor_rosto = (255,255,255)
cor_linha = (96,32,0)
cor_linha_max = (80,176,0)
cor_linha_med =(0,255,255)
cor_alerta = (0,0,255)
cor_ret = (0,0,0)
hoje = str(date.today())
#variaveis auxiliares GaussianBlur
tam_kernel_gauss = (5,5)
desvio_padrao_gauus = 0
#variaveis auxiliares de posição dos textos
posicao_ret_aux = (5,5)
posicao_data = (10,20)
posicao_fps = (10,40)
posicao_distancia = (10,60)
largura_ret_aux = 8
escala_fonte = 1
posicao_dist_medida = (70, 60)
#variaveis auxiliares filtro de borda (canny)
limiar_max = 40
limiar_min = 20
razao = 2
tam_kernel_canny = apertureSize=None
#variaveis auxiliares para o detectmultiscale
fator_escala = 1.1
n_vizinhos = 1
lin_retangulo = 1
#Faz a leitura da câmera
vs = cv2.VideoCapture(0)
#Definir os classificadores
#classificador_carro = cv2.CascadeClassifier('/home/pi/Documents/classificadores/cars.xml')
classificador_carro = cv2.CascadeClassifier('/home/pi/Documents/dados/custom haar cascade/classifier/cascade.xml')
#inicializar as variáveis
#vs.set(cv2.CAP_PROP_FPS,120)
#Captura o tamanho do video (x,y)
x_do_video = int(vs.get(cv2.CAP_PROP_FRAME_WIDTH))
y_do_video = int(vs.get(cv2.CAP_PROP_FRAME_HEIGHT))
#captura do FPS
fps_video = str(vs.get(cv2.CAP_PROP_FPS))
fps_video = fps_video + " FPS"
#parametros de cálculos auxiliares
objeto_area = 0
objeto_larura = 0
objeto_altura = 0
#parametros para localizar a distância focal
#distância(em cm) da câmera ao objeto durante a captura da imagem de referência
distancia_conhecida = 50.00
#largura de um objeto do mundo real (utilizar frente do carro)
largura_real = 14.00
def distancia_foco(distancia_conhecida,largura_real,largura_pixels):
"""Funcao utilizada para capturar a distancia focal, onde:
\n :distancia_conhecida=distância da câmera ao objeto durante a captura da imagem de referência
\n :largura_real = largura de um objeto do mundo real (utilizar frente do carro)
\n :largura_pixels = largura do retangulo que ficará no frame (pixels)(w)"""
distancia_focal = (largura_pixels*distancia_conhecida)/largura_real
return distancia_focal
def medir_distancia(retorno_dist_focal,largura_real_ref,largura_pixels_ref):
"""Função utilizada para medir a distancia da lente até o objeto
\n :retorno_dist_focal = retorno da função distancia_foco
\n :largura_real_ref = largura de um objeto do mundo real (utilizar frente do carro)
\n :largura_pixels_ref = largura do retangulo que ficará no frame (pixels)(w)"
\n :todas as distancias sao dadas em centimetros"""
distancia_real = (largura_real_ref*retorno_dist_focal)/largura_pixels_ref
return distancia_real
def dados_objeto(frame):
"""Função utilizada para retornar a largura em pixels do objeto
/n :frame = imagem desejada"""
#largura do retangulo que ficará no frame (pixels)
largura_pixels = 0
frame = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
faces = classificador_carro.detectMultiScale(frame,1.01,3)
for (x,y,w,h) in faces:
cv2.rectangle(frame, (x,y), ((x+w),(y+h)),cor_rosto, lin_retangulo)
largura_pixels = w
return largura_pixels
#carrega a imagem de referência
img_referencia = cv2.imread("/home/pi/Documents/dados/img_ref/img_46.jpg")
#encontrar a larura em pixels do objeto
largura_obj_ref = dados_objeto(img_referencia)
print(largura_obj_ref)
#encontrar a distancia focal da imagem de referencia
distancia_focal_ref = distancia_foco(distancia_conhecida, largura_real, largura_obj_ref)
# Funções auxiliares para o tratamento da imagem
def aplicar_filtros_imagem(frame):
"""Utilize esta função para tratar a imagem desejada, \n
primeiro a imagem será convertida para uma escala de cinza (cvtColor),\n
o segundo passo é aplicar um filtro passa baixa para remover os ruidos da imagem (GaussianBlur),\n
depois é aplicado uma metodologia para encontrar o limiar adaptativo (adaptiveThreshold)\n
e posteriormente é aplicado um filtro para detectar as bordas da imagem"""
#converte para escala de cinza
frame = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
#equaliza os tons de cinza
frame = cv2.equalizeHist(frame)
#aplica o filtro passa baixa - desfoca a imagem para remover os ruídos, GaussianBlur(imagem,matriz que representa o tamanho do kernel,desvio padrão do kernel gaussiano)
frame = cv2.GaussianBlur(frame, tam_kernel_gauss, desvio_padrao_gauus)
#filtro para encontrar o limiar adaptativo,adaptiveThreshold(imagem,valor máximo=255, ADAPTIVE_THRESH_MEAN_C ou ADAPTIVE_THRESH_GAUSSIAN_C,tipo de limite,vizinhos,constante)
#frame = cv2.adaptiveThreshold(frame,255,cv2.ADAPTIVE_THRESH_GAUSSIAN_C,cv2.THRESH_BINARY,11,2)
#Filtro para detecar as bordas da imagem e também remover os ruidos. Canny(imagem, limite inferior no limite de histerese, limite superior no limite de histerese)
#frame = cv2.Canny(frame, limiar_min, int(limiar_max*razao))#,tam_kernel_canny,L2gradient=None)
#filtro para aplicar a máscara de detecção de movimento
#frame = backSub.apply(frame)
return frame
def inserir_grade(frame):
"""Utilize esta função para inserir a grade auxilia na imagem,\n
esta grade será utilizada para auxiliar na localização do objeto,\n
:frame = imagem que deseja inserir as linhas"""
cont = 0
x_aux = int(x_do_video/4)
cstx = x_aux
y_aux = int(y_do_video/4)
csty = y_aux
while cont < 5:
cv2.line(frame,(x_aux,0),(x_aux,y_do_video),cor_grade,1)
cv2.line(frame,(0,y_aux),(x_do_video,y_aux),cor_grade,1)
cont +=1
x_aux = x_aux + cstx
y_aux = y_aux + csty
return frame
def inserir_linhas(frame):
"""Utilize esta função para inserir as linhas auxiliares na imagem,\n
estas linhas serão utilizadas para medir a distância em que o objeto se encontrar,\n
:frame = imagem que deseja inserir as linhas"""
x_aux = int(x_do_video/4)
y_aux = int(y_do_video/4)
#definição do limite aceitável
#linha lado esquerdo
cv2.line(frame,(int(x_aux-x_aux/4),y_do_video-2*y_aux+int(y_aux/2)),(x_aux,y_aux),cor_linha_max,cv2.LINE_4)
#linha lado direito
cv2.line(frame,(x_do_video-int(x_aux-x_aux/4),y_do_video-2*y_aux+int(y_aux/2)),(x_do_video-x_aux,y_aux),cor_linha_max,cv2.LINE_4)
#linha horizontal
cv2.line(frame,(x_aux,y_aux),(x_do_video-x_aux,y_aux),cor_linha_max,cv2.LINE_4)
#texto
cv2.putText(frame, "Distancia aceitavel",(x_aux+int(x_aux/12),y_aux+int(y_aux/6)), fonte_textos, tamanho_texto, cor_texto,escala_fonte,cv2.LINE_AA)
return frame
def preparar_frame(frame):
"""Utilize esta função para preparar a imagem para ser analizada,\n
:frame = imagem que deseja tratar"""
frame = aplicar_filtros_imagem(frame)
#frame = inserir_grade(frame)
#frame = inserir_linhas(frame)
return frame
while True:
ret, frame = vs.read()
if frame is None:
break
largura_pixels_ref = dados_objeto(frame)
carros = classificador_carro.detectMultiScale(frame,fator_escala,n_vizinhos)
frame = preparar_frame(frame)
for (x,y,w,h) in carros:
cv2.rectangle(frame, (x,y),(x+w,y+h),cor_grade,lin_retangulo)
if largura_pixels_ref != 0:
distancia = medir_distancia(distancia_focal_ref, largura_real, largura_pixels_ref)
cv2.putText(frame, f" {round(distancia,2)} cm",posicao_dist_medida,fonte_textos,tamanho_texto, cor_texto,1,cv2.LINE_AA)
#mostra a imagem em tempo real
cv2.imshow("Video em tempo real", frame)
#sair do loop se pressionar q(quit)
if cv2.waitKey(1) == ord("q"):
print("Video interrompido")
break
#fechar a camera
vs.release()
#fechar o video aberto
cv2.destroyAllWindows()

Pickle not saving in to file

So, i'm coding an discord bot for playing rpg with my friends, and i writed something about 1,3k lines, using pickle and some other librarys, and until my last function it's worked very well, but in this " Atualizar_inventario()" the pickle just dont' save my list " ITEM " in my " Abrir_Para_Escrita", and i dont have any ideia why.
def Autualizar_inventario():
# Booleano para quebrar o looping quando quisermos sair
Sair = False
# Variavel que vai receber nome para comparação
Nome = input("Qual inventario você deseja atualizar?")
print(Nome)
#Abrir arquivo para leitura
Abrir_Inv = open(f"Inventario/{Nome}.pickle", "rb")
Ler_Inv = pickle.load(Abrir_Inv)
# Lista que vai receber os itens que vamos adicionar depois
Item = [Ler_Inv]
# Sender_ID vai servir para só o dono do inventario poder alteralo
Sender_ID = "Jorge" # Yamo altera essa string pra um comando que recebe o ID do usuario
# Se o sender ID for o mesmo que o primeiro parametro " QUE NO CASO SERA O ID"
# if vai ser ativado, nos botando em um looping onde adicionaremos os itens
if Sender_ID == Ler_Inv[0] : # or Sender_ID == "350364616657862679" < -- Codigo para reconhecer o meu discord
while Sair == False:
Input_Item = input("Escreva o nome do item")
# Comando para sair do inventario
if Input_Item == "sair" or Input_Item == "Sair" or Input_Item == "SAIR":
break
# Se sair não for ativado começam as etapas de salvar os novos itens no inventario
else :
# Adiciona o item digitado pelo usuario na lista " ITEM "
Item.append(Input_Item)
# Mostra os parametros // serve apenas para configuração
print("printando item = ", Item)
Abrir_Para_Escrita = open(f"Inventario/{Nome}.pickle", 'wb')
pickle.dump(Item, Abrir_Para_Escrita)
Abrir_Para_Escrita.close()
print("printando arquivo ", Ler_Inv)

convert a tuple of tuples into bytes in python

I'm making a video game in upbge (which for this aspect is basically python) but to send the info between sockets it needs to be in bytes but i only found a way to do it turning it into a string, (because the list get's created with the game (i have a script that once a new entity appears it get's added to the list in the form of (Player-entity|data) but i want the data to variate between entities and i ran out of symbols to use to split it into lists so i'm trying to send the data as a list to be able to simply check it's components, but as it's a list inside of a list (and sometimes more) the bytearray won't work (at least i can't figure out how to make it work)
I'm unsure of how to summarize the code, but this is the code that I have now to generate that info
import socket
mi_socket = socket.socket()
mi_socket.bind(('127.0.0.1',55555))
mi_socket.listen()
TP = 0 #Total players
AP = 0 #Actual player
PL = ["host"] #Player List
AE = 0 #Actual entity
TE = 0 #Total entities
EL = ["|PlayerEntity$[Data]|"] #Entity list
PI = [] #Player Intel (Player name, Total Players, Player Code) (apartado uno en las comunicaciones)
order = None #Variable reservada para guardar comandos u identificaciones (ej: nombre de la entidad) en las comunicaciones
content = None #Variable reservada para almacenar la información recibida
incoming = 0 #Variable reservada para analizar el mensaje recibido de entrada
def login():
global AP
global TP
global PL
PJ = str(incoming).split("$")[1] #incoming Player
if AP <= TP:
if PJ!=str(PL[int(AP)]): #Nombre jugador que se conecta
AP+=1
login()
pass
else:
identity()
pass
if AP > TP:
PL.append(str("Player" + str(AP))) #Agregar jugador a la lista
TP = int(AP)
def identity(): #identifica de qué se trata la orden para responder en consecuencia, si se trata de entidad anota tmb la entidad en la lista
global TE
global AE
global EL
global AP
global PL
PJ = str(incoming).split("$")[1] # incoming Player
PE = str(incoming).split("$")[2] # incoming entity
if AE <= TE:
# Si nombre de jugador|nombre de objeto no és EL[AE]([1]|[2])
if str(str(PL[AP])+"-"+str(PE)) != str(str(EL[AE]).split("|")[1]).split("$")[0]:
AE+=1
identity()
pass
else:
EL[AE] = "|"+PL[AP]+"-"+PE+"$"+str(incoming).split("$")[3]+"|"
if AE > TE:
EL.append("|"+PL[AP]+"-"+PE+"$"+str(incoming).split("$")[3]+"|")
TE = int(AE)
def main():
global AP
global AE
global TE
global incoming
conexion, ip = mi_socket.accept()
incoming = conexion.recv(1024)
login()
conexion.send(str("#"+str(PL[AP])+"#"+str(EL[1:TE+1])+"#").encode())
AP=0
AE=0
conexion.close()
while True:
main()

Cant get my functions (Munt2 and Munt1) to subtract my global variable (aantal_munten)

I have a problem with my code (trying to make the NIM game with a Tkinter GUI). Anyhow i cant get my functions (Munt1, Munt2) to subtract to my global (aantal_munten). And i dont know how to fix it. Can someone point me in the right direction? Also the TKinter gui is still a bit new for me so if you have any tips or tricks for me they are well appreciated!
import tkinter
import random
def toonStartscherm():
keuzescherm.pack_forget()
spelerscherm.pack_forget()
startscherm.pack()
def toonKeuzescherm():
keuzescherm.pack()
startscherm.pack_forget()
spelerscherm.pack_forget()
def spelOptie1():
keuzescherm.pack_forget()
startscherm.pack_forget()
spelerscherm.pack()
def randomSpeler():
beginnende_speler = random.choice(['1', '2'])
speler = beginnende_speler
if speler == '1':
speler = '2'
else:
speler = '1'
return str(speler)
def Munt1():
eenMunt = 1
aantal_munten -= eenMunt
def Munt2():
tweeMunt = 2
aantal_munten -= tweeMunt
nim_spel = tkinter.Tk()
global aantal_munten
aantal_munten = 7
startscherm = tkinter.Frame(master=nim_spel)
startscherm.pack()
start_welkom = tkinter.Label(startscherm, text= 'Welkom bij het NIM spel! \nHieronder volgende de spelregels.')
start_welkom.pack()
start_uitleg = tkinter.Label(startscherm, text= 'Het spel NIM start met 7 munten, elke speler mag één of twee munten pakken. \n De speler die de laatste munt pakt verliest!')
start_uitleg.pack() # zet uitleg automatisch in venster
doorgaan_knop = tkinter.Button(startscherm, text = 'Ik snap de regels!', fg = 'green', command = toonKeuzescherm) # maakt knop en laat stoppen
doorgaan_knop.pack(side = 'bottom')
keuzescherm = tkinter.Frame(master=nim_spel)
keuzescherm.pack()
keuze_opties = tkinter.Label(keuzescherm, text='Het NIM spel kan op twee manieren gespeeld worden. \n Optie 1: Tegen elkaar \n Optie 2: Tegen de computer')
keuze_opties.pack() # zet opties automatisch in venster
keuze_vraag = tkinter.Label(keuzescherm, text='Voor welke optie kies je?')
keuze_vraag.pack()
optie_1 = tkinter.Button(keuzescherm, text = 'Optie 1', fg = 'green', command = spelOptie1) # maakt knop en laat stoppen
optie_1.pack(side = 'left')
optie_2 = tkinter.Button(keuzescherm, text = 'Optie 2', fg = 'red', command = keuzescherm.quit) # maakt knop en laat stoppen
optie_2.pack(side = 'right')
spelerscherm = tkinter.Frame(master=nim_spel)
spelerscherm.pack()
beurt_speler = tkinter.Label(spelerscherm, text='Speler ' + (randomSpeler()) + ' is aan de beurt!')
beurt_speler.pack()
munten_over = tkinter.Label(spelerscherm, text='Er zijn nog ' + (str(aantal_munten)) + ' aantal munten over, hoeveel pak je er?')
munten_over.pack()
pak_1_munt = tkinter.Button(spelerscherm, text = '1 munt', fg = 'blue', command = Munt1)
pak_1_munt.pack(side = 'left')
pak_2_munt = tkinter.Button(spelerscherm, text = '2 munten', fg = 'blue', command = Munt2)
pak_2_munt.pack(side = 'right')
toonStartscherm()
nim_spel.mainloop()
def Munt1():
global aantal_munten
eenMunt = 1
aantal_munten -= eenMunt
def Munt2():
global aantal_munten
tweeMunt = 2
aantal_munten -= tweeMunt
I just added the global aantal_munten line and checked it, and it's working perfectly now.

Proper way to call class variables from another script without initializing them again

I'm trying to call these 3 class variables from another script, by importing the calls onto the new script. This is how it's suppose to work, when the logIn.py runs if you typed the correct user and password, they're saved in user and password variables. if you fail, 1 is added to the fail variable. At 1st I had the like this fail = 0, user = "", password = "" cause I was getting undefined errors. Everything worked, but when I create an object of that class, everything was again initialized to fail = 0, user = "", password = "". So I thought "maybe if I use StringVar and IntVar that'll fix the problem". But instead I get this error.
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'
I'm pretty sure it's related to the String,IntVar. If this works properly, on mainPage3 I'll generate a report and these 3 variables are some the ones I'll use.
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(where I import class from 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()
Ignore all of the Spanish comments and the Spanglish variables lol.
Thanks
You have to create a root window before you can create instances of StringVar or IntVar
Put form = Tk() befor class declaration and before imported class
global form
form = Tk()
from logIn_screen import checkValidation
class formManipulation:
# rest of code

Categories