IntVar devuelve solo 0 incluso con la función .get ()


Este es un modelo de población, por lo que las entradas deben ser números enteros que deben utilizarse para el cálculo.

import sys import tkinter from tkinter import* import time global v global popJ popJ = 0 def genInput(): #Allows the user to input the data gen = Tk() gen.wm_title("Data Input") v = IntVar() ent1 = Entry(gen, textvariable = v).pack() ent1Txt = Label(gen, text = 'Input Juvenile Populations') ent1Txt.pack() v2 = StringVar() ent2 = Entry(gen, textvariable = v2) ent2Txt = Label(gen, text = 'Input Adult Populations') ent2.pack() ent2Txt.pack() v3 = StringVar() ent3 = Entry(gen, textvariable = v3) ent3Txt = Label(gen, text = 'Input Senile Populations') ent3.pack() ent3Txt.pack() v4 = StringVar() ent4 = Entry(gen, textvariable = v4) ent4Txt = Label(gen, text = 'Input Survival rates for Juveniles') ent4.pack() ent4Txt.pack() v5 = StringVar() ent5 = Entry(gen, textvariable = v5) ent5Txt = Label(gen, text = 'Input Survival rates for Adults') ent5.pack() ent5Txt.pack() v6 = StringVar() ent6 = Entry(gen, textvariable = v6) ent6Txt = Label(gen, text = 'Input Survival rates for Seniles') ent6.pack() ent6Txt.pack() v7 = StringVar() ent7 = Entry(gen, textvariable = v7) ent7Txt = Label(gen, text = 'Input the birth rate') ent7.pack() ent7Txt.pack() v8 = StringVar() ent8 = Entry(gen, textvariable = v8) ent8Txt = Label(gen, text = 'Number of Generations') ent8.pack() ent8Txt.pack() def quit1(): # Need to be here or it breaks the program gen.destroy() return def submit(): popJ = v.get() popJtxt = Label(gen, text= v.get()).pack() return submit1= Button(gen, text="Submit") submit1.pack() submit1.configure(command = submit) return1 = Button(gen, text = 'Return to Menu') return1.pack(pady=30) return1.configure(command = quit1) return def genView(): # should display the data disp = Tk() disp.wm_title('Displaying data Values') popJuvenilesTxt = Label (disp, text = popJ) popJuvenilesTxt.grid(row =1, column = 1) def menu(): # creates the gui menu menu = Tk() menu.wm_title("Greenfly model") genInp = Button(menu,text = "Set Generation Values") genVew = Button(menu,text = 'Dysplay Generation Values') modelCal = Button(menu,text = 'Run model') exportData = Button(menu,text = 'Export Data') genTxt = Label(menu, text='Input the Generation values') genvTxt = Label (menu, text = 'View the current generation values') modelTxt = Label (menu, text = 'Run the model') exportTxt = Label (menu, text = 'Export data') genInp.grid(row=1, column=1) genVew.grid(row=2, column=1) modelCal.grid(row=3, column=1) exportData.grid(row=4 , column=1) genTxt.grid(row=1, column = 2) genvTxt.grid(row=2, column =2) modelTxt.grid(row=3, column =2) exportTxt.grid(row=4, column = 2) genInp.configure(command = genInput) genVew.configure(command = genView) menu() 

El ‘Enviar’ y la sección genView siguen devolviendo 0 aunque se usa .get (). Si se utiliza StringVar, devuelve un espacio en blanco. El modelo de ejecución y las funciones de datos de exportación aún no están implementadas.

el problema es que estás creando varias instancias de Tk , para las ventanas secundarias deberías usar Toplevel , así que esto funciona:

 import sys import tkinter from tkinter import * import time global v global popJ popJ = 0 def genInput(): #Allows the user to input the data gen = Toplevel() gen.wm_title("Data Input") v = IntVar() ent1 = Entry(gen, textvariable = v).pack() ent1Txt = Label(gen, text = 'Input Juvenile Populations') ent1Txt.pack() v2 = StringVar() ent2 = Entry(gen, textvariable = v2) ent2Txt = Label(gen, text = 'Input Adult Populations') ent2.pack() ent2Txt.pack() v3 = StringVar() ent3 = Entry(gen, textvariable = v3) ent3Txt = Label(gen, text = 'Input Senile Populations') ent3.pack() ent3Txt.pack() v4 = StringVar() ent4 = Entry(gen, textvariable = v4) ent4Txt = Label(gen, text = 'Input Survival rates for Juveniles') ent4.pack() ent4Txt.pack() v5 = StringVar() ent5 = Entry(gen, textvariable = v5) ent5Txt = Label(gen, text = 'Input Survival rates for Adults') ent5.pack() ent5Txt.pack() v6 = StringVar() ent6 = Entry(gen, textvariable = v6) ent6Txt = Label(gen, text = 'Input Survival rates for Seniles') ent6.pack() ent6Txt.pack() v7 = StringVar() ent7 = Entry(gen, textvariable = v7) ent7Txt = Label(gen, text = 'Input the birth rate') ent7.pack() ent7Txt.pack() v8 = StringVar() ent8 = Entry(gen, textvariable = v8) ent8Txt = Label(gen, text = 'Number of Generations') ent8.pack() ent8Txt.pack() def quit1(): # Need to be here or it breaks the program gen.destroy() return def submit(): popJ = v.get() popJtxt = Label(gen, text= popJ).pack() # as stated in comments, this line will return none to popJtxt, so it pointless to assign it return submit1= Button(gen, text="Submit") submit1.pack() submit1.configure(command = submit) return1 = Button(gen, text = 'Return to Menu') return1.pack(pady=30) return1.configure(command = quit1) return def genView(): # should display the data disp = Toplevel() disp.wm_title('Displaying data Values') popJuvenilesTxt = Label (disp, text = popJ) popJuvenilesTxt.grid(row =1, column = 1) def menu(): # creates the gui menu menu = Tk() menu.wm_title("Greenfly model") genInp = Button(menu,text = "Set Generation Values") genVew = Button(menu,text = 'Dysplay Generation Values') modelCal = Button(menu,text = 'Run model') exportData = Button(menu,text = 'Export Data') genTxt = Label(menu, text='Input the Generation values') genvTxt = Label (menu, text = 'View the current generation values') modelTxt = Label (menu, text = 'Run the model') exportTxt = Label (menu, text = 'Export data') genInp.grid(row=1, column=1) genVew.grid(row=2, column=1) modelCal.grid(row=3, column=1) exportData.grid(row=4 , column=1) genTxt.grid(row=1, column = 2) genvTxt.grid(row=2, column =2) modelTxt.grid(row=3, column =2) exportTxt.grid(row=4, column = 2) genInp.configure(command = genInput) genVew.configure(command = genView) menu() 

para explicar por qué sucede esto, debe comprender que todas las variables tk se crean con una instancia Tk asociada (generalmente la primera instancia), por lo que vincular una variable que pertenece a una instancia tk a una pantalla creada en otra nunca actualizará la variable, creando una Toplevel lugar de Tk asocia con la primera instancia de Tk

No debe crear más de una ventana raíz / maestra utilizando Tk() . Cambie las llamadas Tk() en genInput() y genView() a Toplevel() .

También el menu() debe tener un menu.mainloop() al final de la función.

Como furas menciona en los comentarios, los .pack() y .pack() devuelven None , no el widget, por lo que no tiene sentido almacenar el resultado de llamar a esos métodos.

Algunas otras observaciones …

import time pero parece que no lo está utilizando. Si pretende usar time.sleep() algún lugar, no lo haga: no cooperará adecuadamente con el bucle de eventos de Tkinter; Hay otras formas de hacer demoras, utilizando los métodos proporcionados por Tkinter.

Ha import tkinter y también from tkinter import * . La import tkinter permite referirse a las entidades Tkinter haciendo, por ejemplo, tkinter.Entry , pero no está utilizando esa syntax en ningún lugar de su código. from tkinter import * te permite hacer una Entry pero la desventaja es que el espacio de nombres de tu script se ve afectado por todos los nombres que define Tkinter. Un mejor compromiso es usar import tkinter as tk y luego puedes hacer tk.Entry , para evitar la contaminación del espacio de nombres con solo un poquito más de escritura.

Tu código sería más limpio si lo pones en una clase. Y de esa manera no necesitarías usar global . Sin embargo, debo tener en cuenta que en realidad no estás usando global correctamente en tu código. No lo usa para “declarar” una variable en el ámbito global, sino que debe ir dentro de una definición de función (o método) para indicar que la función está modificando un nombre en el ámbito global.


Aquí hay una versión “condensada” de su progtwig que establece y obtiene el valor popJ correctamente. Este código se probó en Python 2.6.6, para ejecutarlo en Python 3 deberá cambiar la statement de import from tkinter import * .

 from Tkinter import * popJ = 0 def genInput(): #Allows the user to input the data gen = Toplevel() gen.wm_title("Data Input") v = IntVar() v.set(popJ) ent1 = Entry(gen, textvariable = v) ent1.pack() Label(gen, text = 'Input Juvenile Populations').pack() def quit1(): # Need to be here or it breaks the program gen.destroy() def submit(): global popJ popJ = v.get() Label(gen, text=popJ).pack() return submit1= Button(gen, text="Submit") submit1.pack() submit1.configure(command = submit) return1 = Button(gen, text = 'Return to Menu') return1.pack(pady=30) return1.configure(command = quit1) def menu(): # creates the gui menu menu = Tk() menu.wm_title("Greenfly model") genInp = Button(menu,text = "Set Generation Values") genInp.grid(row=1, column=1) genInp.configure(command = genInput) menu.mainloop() menu() 

Tienes que usar global popJ en submit .

Ahora creas la variable local popJ en submit


EDITAR: quizás global método global no sea el preferido, pero funciona en tu ejemplo.

 import sys import tkinter from tkinter import* import time global v global popJ popJ = 0 def genInput(): #Allows the user to input the data gen = Toplevel() gen.wm_title("Data Input") v = IntVar() ent1 = Entry(gen, textvariable = v).pack() ent1Txt = Label(gen, text = 'Input Juvenile Populations') ent1Txt.pack() v2 = StringVar() ent2 = Entry(gen, textvariable = v2) ent2Txt = Label(gen, text = 'Input Adult Populations') ent2.pack() ent2Txt.pack() v3 = StringVar() ent3 = Entry(gen, textvariable = v3) ent3Txt = Label(gen, text = 'Input Senile Populations') ent3.pack() ent3Txt.pack() v4 = StringVar() ent4 = Entry(gen, textvariable = v4) ent4Txt = Label(gen, text = 'Input Survival rates for Juveniles') ent4.pack() ent4Txt.pack() v5 = StringVar() ent5 = Entry(gen, textvariable = v5) ent5Txt = Label(gen, text = 'Input Survival rates for Adults') ent5.pack() ent5Txt.pack() v6 = StringVar() ent6 = Entry(gen, textvariable = v6) ent6Txt = Label(gen, text = 'Input Survival rates for Seniles') ent6.pack() ent6Txt.pack() v7 = StringVar() ent7 = Entry(gen, textvariable = v7) ent7Txt = Label(gen, text = 'Input the birth rate') ent7.pack() ent7Txt.pack() v8 = StringVar() ent8 = Entry(gen, textvariable = v8) ent8Txt = Label(gen, text = 'Number of Generations') ent8.pack() ent8Txt.pack() def quit1(): # Need to be here or it breaks the program gen.destroy() return def submit(): global popJ popJ = v.get() popJtxt = Label(gen, text= v.get()).pack() return submit1= Button(gen, text="Submit") submit1.pack() submit1.configure(command = submit) return1 = Button(gen, text = 'Return to Menu') return1.pack(pady=30) return1.configure(command = quit1) return def genView(): # should display the data disp = Toplevel() disp.wm_title('Displaying data Values') popJuvenilesTxt = Label (disp, text = popJ) popJuvenilesTxt.grid(row =1, column = 1) def menu(): # creates the gui menu menu = Tk() menu.wm_title("Greenfly model") genInp = Button(menu,text = "Set Generation Values") genVew = Button(menu,text = 'Dysplay Generation Values') modelCal = Button(menu,text = 'Run model') exportData = Button(menu,text = 'Export Data') genTxt = Label(menu, text='Input the Generation values') genvTxt = Label (menu, text = 'View the current generation values') modelTxt = Label (menu, text = 'Run the model') exportTxt = Label (menu, text = 'Export data') genInp.grid(row=1, column=1) genVew.grid(row=2, column=1) modelCal.grid(row=3, column=1) exportData.grid(row=4 , column=1) genTxt.grid(row=1, column = 2) genvTxt.grid(row=2, column =2) modelTxt.grid(row=3, column =2) exportTxt.grid(row=4, column = 2) genInp.configure(command = genInput) genVew.configure(command = genView) menu.mainloop() menu() 

por supuesto, también necesitas menu.mainloop() y Toplevel en lugar de Tk .