Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/341.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 即使使用.get()函数,IntVar也只返回0_Python_Tkinter_Tkinter Canvas - Fatal编程技术网

Python 即使使用.get()函数,IntVar也只返回0

Python 即使使用.get()函数,IntVar也只返回0,python,tkinter,tkinter-canvas,Python,Tkinter,Tkinter Canvas,这是一个总体模型,因此条目必须是整数才能用于计算 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(

这是一个总体模型,因此条目必须是整数才能用于计算

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()

尽管使用了.get(),但“Submit”和genView部分仍继续返回0。如果使用StringVar,它将返回一个空格。运行模型和导出数据功能尚未实现

问题在于,您正在创建多个
Tk
实例,对于子窗口,您应该使用
Toplevel
,这样可以:

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()

为了解释为什么会发生这种情况,您需要了解所有tk变量都是使用关联的tk实例(通常是第一个实例)创建的,因此将属于一个tk实例的变量绑定到另一个tk实例中创建的显示将永远不会更新该变量,创建一个
Toplevel
而不是
Tk
将其与第一个
Tk
实例相关联。问题是您正在创建多个
Tk
实例,对于子窗口,您应该改为使用
Toplevel
,因此这是可行的:

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()

为了解释为什么会发生这种情况,您需要了解所有tk变量都是使用关联的tk实例(通常是第一个实例)创建的,因此将属于一个tk实例的变量绑定到另一个tk实例中创建的显示将永远不会更新该变量,创建一个
Toplevel
而不是
Tk
将其与第一个
Tk
实例相关联您不应该使用
Tk()
创建多个根/主窗口。将
genInput()
genView()
中的
Tk()
调用更改为
Toplevel()

另外,
menu()
应该在函数末尾有一个
menu.mainloop()

正如furas在评论中提到的,
.pack()
.grid()
方法返回
None
,而不是小部件,因此存储调用这些方法的结果是毫无意义的

其他一些观察结果

您可以
导入时间
,但似乎没有使用它。如果您打算在某处使用
time.sleep()
,请不要:它将无法与Tkinter的事件循环正常合作;使用Tkinter提供的方法,还有其他方法来实现延迟

您有
import tkinter
来自tkinter import*
import tkinter
允许您通过执行例如
tkinter.Entry
来引用tkinter实体,但您在代码中的任何地方都没有使用该语法
fromtkinter import*
允许您执行
Entry
操作,但缺点是脚本的命名空间会被tkinter定义的所有名称所阻塞。更好的折衷方法是使用
import tkinter as tk
,然后您可以执行
tk.Entry
,这样您只需稍微多键入一点就可以避免名称空间污染

如果你把代码放到一个类中,你的代码会更整洁。这样您就不需要使用
global
。但是,我应该注意到,您实际上并没有在代码中正确使用
global
。您不会使用它来“声明”全局范围中的变量,相反,它应该进入函数(或方法)定义中,以指示函数正在修改全局范围中的名称


这里有一个程序的“压缩”版本,可以正确设置和获取
popJ
值。这段代码是在Python2.6.6上测试的,要在Python3上运行它,您需要将
import
语句从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()

您不应该使用
Tk()
创建多个根/主窗口。将
genInput()
genView()
中的
Tk()
调用更改为
Toplevel()

另外,
menu()
应该在函数末尾有一个
menu.mainloop()

正如furas在评论中提到的,
.pack()
.grid()
方法返回
None
,而不是小部件,因此存储调用这些方法的结果是毫无意义的

其他一些观察结果

您可以
导入时间
,但似乎没有使用它。如果您打算在某处使用
time.sleep()
,请不要:它将无法与Tkinter的事件循环正常合作;使用Tkinter提供的方法,还有其他方法来实现延迟

您有
import tkinter
来自tkinter import*
import tkinter
允许您通过执行例如
tkinter.Entry
来引用tkinter实体,但您在代码中的任何地方都没有使用该语法
fromtkinter import*
允许您执行
Entry
操作,但缺点是脚本的命名空间会被tkinter定义的所有名称所阻塞。更好的折衷方法是使用
import tkinter as tk
,然后您可以执行
tk.Entry
,这样您只需稍微多键入一点就可以避免名称空间污染

如果你把代码放到一个类中,你的代码会更整洁。这样您就不需要使用
global
。但是,我应该注意到,您实际上并没有在代码中正确使用
global
。您不会使用它来“声明”全局范围中的变量,相反,它应该进入函数(或方法)定义中,以指示函数正在修改全局范围中的名称


这里有一个程序的“压缩”版本,可以正确设置和获取
popJ
值。这段代码是在Python2.6.6上测试的,要在Python3上运行它,您需要将
import
语句从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()

您必须在
submit
中使用
global popJ

现在您可以在
submit
中创建局部变量
popJ


EDIT:也许
global
不是首选方法,但它在您的示例中有效

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()
当然,您需要p中的
menu.mainloop()
Toplevel