Python Gui条目值不是字符串而是方法?

2024-04-26 17:57:04 发布

您现在位置:Python中文网/ 问答频道 /正文

我的程序有个小问题: 我无法理解如何在程序中重用输入的值。它说我不能在方法上使用float,但我认为s.get给了我一个字符串。似乎它实际上并不使用输入的值,而是使用默认值。 有人知道代码有什么问题吗?你知道吗

from tkinter import *
from math import *
import numpy as np
import matplotlib.pyplot as plt

class GUI:
    def __init__(self):
        self.root      = Tk()
        self.labelVariable = StringVar()
        self.root.title('Projet informatique')
        self.initialize()
        self.root.mainloop()

    def initialize(self):
        self.main = Frame(self.root)
        self.main.pack() 

        label = Label(self.main, textvariable=self.labelVariable, font=('courier',10,'bold'), anchor="w", fg="red", bg="white")
        label.pack()

        self.labelVariable.set(u"Modélisation de populations atteintes d'un virus")

        v=Listbox(self.main)
        v.insert("end","Modèle SIR")
        v.insert("end", "Modèle de Witowski")
        v.insert("end", "Modèle de Munz")
        v.insert("end", "Modèle avec traitement")
        v.bind("<Double-Button-1>", self.Double) 
        v.pack(expand=1,fill=BOTH)


    def Double(self,event):
        widget    = event.widget
        selection = widget.curselection()
        value     = widget.get(selection[0])
        self.newWindow(value)

    def ModifyTextarea(self,elem,msg,clear=None):
        elem.config(state=NORMAL)
        if clear:
            elem.delete(1.0, END)
        else:
           elem.insert(END,msg)
        elem.config(state=DISABLED)
    def newWindow(self,msg):
        top = Toplevel(self.root)
        q1 = Frame(top)
        q1.pack()
        top.grab_set()
        text = Text(q1,state=DISABLED,exportselection=True)
        text.pack()
        lbl = Label(q1,text="")
        lbl.pack()
        self.ModifyTextarea(text,msg)

        v2=StringVar()
        v3=StringVar()
        v4=StringVar()
        v5=StringVar()
        v1=StringVar()
        v6=StringVar()
        e1=Entry(q1,textvariable=v1)
        e2=Entry(q1,textvariable=v2)
        e3=Entry(q1,textvariable=v3)
        e4=Entry(q1,textvariable=v4)
        e5=Entry(q1,textvariable=v5)
        e6=Entry(q1,textvariable=v6)
        e1.pack()
        e2.pack()
        e3.pack()
        e4.pack()
        e5.pack()
        e6.pack()
        v1.set("Taux de mortalité des zombies")
        v2.set("Coefficient de propagation du virus")
        v3.set("Taux de rémission")
        v4.set("Taux d'infectés devenant malades")
        v5.set("Taux de guérison")
        v6.set("Pas de temps")

        a=v1.get
        b=v2.get
        ze=v3.get
        T=v4.get
        N=v5.get
        dt=v6.get
        def callback():
            print (a,b,ze,T,N,dt)

        btnquit = Button(q1,width = 1,text = "Ok",command =callback())
        btnquit.pack()


        def zombies(a,b,ze,T,N,dt) :
            a=flot(a)
            b=float(b)
            ze=float(ze)
            T=float(T)
            N=float(N)
            dt=float(dt)
            n = T/dt
            n=int(n)
            t=np.zeros((n+1))
            for i in range (0,n):
                t[0]=0
                t[i+1]=t[i]+dt
            s = np.zeros((n+1))
            z = np.zeros((n+1))
            r = np.zeros((n+1))
            s[0] = N-1
            z[0] =1
            r[0] = 0

            for i in range (n-1):
                s[i+1] = s[i] + dt*(-b*s[i]*z[i])
                z[i+1] = z[i] + dt*(b*s[i]*z[i]-a*s[i]*z[i]+ze*r[i])
                r[i+1] = r[i] + dt*(a*s[i]*z[i]- ze*r[i])

                if s[i+1]<0 or s[i+1] >N:
                    s[i+1]=0
                    break

                if z[i+1] > N or z[i+1] < 0:
                    z[i+1]=0
                    break

                if r[i+1] <0 or r[i+1] >N:
                    r[i+1]=0
                    break
                return (t,s,r,z,i+2)

        t,s,r,z,i=zombies(a,b,ze,T,N,dt)
        plt.plot(t[:i],s[:i],'b')
        plt.plot(t[:i],z[:i],'r')
        plt.plot(t[:i],r[:i],'y')
        plt.show()

if __name__ == "__main__":
    app = GUI()

Tags: selfgetdefnpdtdepltfloat
2条回答

这些都是错误的:

a=v1.get
b=v2.get
ze=v3.get
T=v4.get
N=v5.get
dt=v6.get

您没有调用get函数。要调用它,请添加括号:

a=v1.get()
...

FWIW,您不需要为每个条目小部件使用StringVars。您可以同样轻松地直接从小部件获取值。使用StringVar通常只是添加额外的代码和额外的对象来管理,而没有真正的好处。你知道吗

问题是您只是引用get方法,而不是调用它们。另外,您应该确保在回调函数中调用这些函数,否则在初始化UI时总是打印这些变量的值。最后,请注意,不是将callback绑定到按钮,而是执行一次函数并将其结果绑定到按钮。你知道吗

def callback():
    # here, you have to ADD () to get the result of get
    print(v1.get(), v2.get(), v3.get(), v4.get(), v5.get(), v6.get())

# here, you have to REMOVE () to get the callback function itself
btnquit = Button(q1, width=1, text="Ok", command=callback)

类似地,在zombies函数中:

def zombies(): # no need for input parameters
    a = float(v1.get())
    b = float(v2.get())
    etc.

最后,您必须将该函数绑定到一个按钮(可能不是callback函数?)否则zombies将在newWindow方法结束时执行一次,即在输入任何实际数据之前。绘图可能也是该功能的一部分。你知道吗

相关问题 更多 >