Calificación:
  • 0 voto(s) - 0 Media
  • 1
  • 2
  • 3
  • 4
  • 5
Tkinter Textvariable Entry problema
#1
Buenas:

Tengo este pequeño código de prueba:

  1. import tkinter as tk
  2. from tkinter import ttk
  3. from datetime import *
  4. from tkinter import messagebox
  5. import time
  6. import calendar
  7. import psycopg2
  8. import threading
  9. from threading import Timer
  10. import os
  11. import sys
  12. import tkinter.font as tkfont
  13. from functools import partial
  14. import subprocess
  15. import smtplib
  16. from email.mime.multipart import MIMEMultipart
  17. from email.mime.text import MIMEText
  18. from email.mime.base import MIMEBase
  19. from email import encoders
  20.  
  21.  
  22. class Prueba:
  23.      
  24.       def __init__(self):
  25.            
  26.             ###### Ventana Principal #########
  27.            
  28.             self.win = tk.Tk()
  29.             self.win.title('PRUEBAS')
  30.             self.win.geometry('600x400+100+0')
  31.            
  32.             ####### Variables Generales ####### 
  33.             self.num = tk.IntVar()
  34.             self.num = 0
  35.            
  36.             self.num01 = tk.IntVar()
  37.             self.num01 = 0
  38.             ####### Listas Generales #########
  39.            
  40.             self.list01 = []
  41.            
  42.             ####### Funciones Generales #######
  43.            
  44.             def addnum():
  45.                  
  46.                   self.list01.append('ELE')
  47.                   self.ent01.delete(0, tk.END)
  48.                   self.num += 1
  49.                   self.ent01.insert(0, self.num)
  50.                   print(self.list01)
  51.            
  52.             def addnum2():
  53.                  
  54.                   self.list01.append('ELE1')
  55.                   self.ent02.delete(0, tk.END)
  56.                   self.num01 += 1
  57.                   self.ent02.insert(0, self.num01)
  58.                   print(self.list01)
  59.                  
  60.             def quitar():
  61.                   try:
  62.                         self.list01.remove('ELE')
  63.                         self.num -= 1
  64.                         self.ent01.delete(0,tk.END)
  65.                         self.ent01.insert(0, self.num)
  66.                   except:
  67.                         pass
  68.                   print(self.list01)
  69.  
  70.             ####### Etiquetas Generales #######
  71.            
  72.             ####### Entrys Generales #######
  73.            
  74.             self.ent01 = ttk.Entry(self.win, width=1, textvariable=self.num, font=('Ubuntu', 30))
  75.             self.ent01.grid(row=0, column=1, padx=5, pady=5)
  76.             self.ent01.insert(0, '0')
  77.            
  78.             self.ent02 = ttk.Entry(self.win, width=1, textvariable=self.num01, font=('Ubuntu', 30))
  79.             self.ent02.grid(row=1, column=1, padx=5, pady=5)
  80.             self.ent02.insert(0, '0')
  81.            
  82.             ####### Botones Generales ##########
  83.            
  84.             self.but01 = ttk.Button(self.win, text='ELE', command=addnum)
  85.             self.but01.grid(row=0, column=0, padx=5, pady=5)
  86.            
  87.             self.but02 = ttk.Button(self.win, text='ELE1', command=addnum2)
  88.             self.but02.grid(row=1, column=0, padx=5, pady=5)
  89.            
  90.             self.but03 = ttk.Button(self.win, text='-', width=1, command=quitar)
  91.             self.but03.grid(row=0, column=2, padx=5, pady=5)
  92.            
  93.            
  94.                        
  95.             self.win.mainloop()
  96.          
  97.  
  98. def main():
  99.     myapp = Prueba()
  100.  
  101. if __name__ == '__main__':
  102.     main()


Bien, el problema es que cuando clickeas cualquiera de los botones el incremento del número se refleja en los dos entrys y debería hacerlo solo en uno de ellos dependiendo del botón que clickeases y no entiendo muy bien el por qué. Son dos variables distintas del tipo IntVar. No lo entiendo.

Muchas Gracias.
Responder
#2
Hola.

Las variables de Tk (tk.IntVar, tk.StringVar, etc.) funcionan con los métodos get() y set(), a diferencia de las variables tradicionales de Python. Chequeá el ejemplo al final de este artículo: https://recursospython.com/guias-y-manua...y-tkinter/. Así, la inicialización de tus variables debería ser:

  1. ####### Variables Generales #######
  2. self.num = tk.IntVar()
  3. self.num.set(0)
  4.  
  5. self.num01 = tk.IntVar()
  6. self.num01.set(0)


Y luego la función:

  1. def addnum():
  2. self.list01.append('ELE')
  3. self.num.set(self.num.get() + 1)
  4. print(self.list01)


Como la variable self.num está asociada a la caja de texto, cada vez que cambies el valor de la variable Tk actualizará el contenido de la caja.

Saludos
Responder
#3
(23-08-2021, 09:17 PM)Francisco escribió: Hola.

Las variables de Tk (tk.IntVar, tk.StringVar, etc.) funcionan con los métodos get() y set(), a diferencia de las variables tradicionales de Python. Chequeá el ejemplo al final de este artículo: https://recursospython.com/guias-y-manua...y-tkinter/. Así, la inicialización de tus variables debería ser:

  1. ####### Variables Generales ####### 
  2. self.num = tk.IntVar()
  3. self.num.set(0)
  4.  
  5. self.num01 = tk.IntVar()
  6. self.num01.set(0)


Y luego la función:

  1. def addnum():
  2.       self.list01.append('ELE')
  3.       self.num.set(self.num.get() + 1)
  4.       print(self.list01)


Como la variable self.num está asociada a la caja de texto, cada vez que cambies el valor de la variable Tk actualizará el contenido de la caja.

Saludos

Joer. No me acordaba que los métodos set() y get() son para las variables tk.(La verdad es que hacía mucho que no necesitaba usarlas y claro de no usarlo se olvida)

Muchas gracias Francisco.
Responder


Salto de foro:


Usuarios navegando en este tema: 1 invitado(s)