重用在Tkinter GUI中输入的值以进行进一步编程

时间:2015-03-10 08:23:37

标签: python user-interface tkinter

我目前有点困在程序的关键点 - 我们创建了一个GUI,让用户可以选择他们想要使用的人口模型,然后让他们在输入框中输入值。 我现在希望在另一个函数中重用这些值。这就是我如何想象它应该如何运作。

如果选择了x:

  • 使用输入的值
  • 执行此操作
  • 绘制此图

以下是GUI的实际代码:

from tkinter import *
from math import *

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)
        e1=Entry(q1)
        label1 = Label(self.main, textvariable="Taux de mortalité des zombies")
        e2=Entry(q1)
        e3=Entry(q1)
        e4=Entry(q1)
        e5=Entry(q1)
        label1.pack()
        e1.pack()
        e2.pack()
        e3.pack()
        e4.pack()
        e5.pack()
        e1.insert(10,"Taux de mortalité des zombies")
        e2.insert(10,"Coefficient de propagation du virus")
        e3.insert(10,"Taux de rémission")
        e4.insert(10,"Taux d'infectés devenant malades")
        e5.insert(10,"Taux de guérison")

        btnquit = Button(q1,borderwidth = 1,text = "Ok",command =lambda: top.destroy())
        btnquit.pack()

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

以下是问题:

  • 我不知道如何获得列表框中所选内容的值,以便为“if”重用。
  • 我真的不知道如何获得输入框中输入的数值。我明白我必须使用.get但我只能打印它,而不是在其他功能中使用它。
  • 这不太重要,但我尝试在条目小部件旁边放置标签,但它们没有显示出来。有什么想法吗?

只是为了让您了解GUI后面的功能类型:

import numpy as np
import matplotlib.pyplot as plt
def zombies(a,b,ze,d,c,T,N,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))
    e = np.zeros((n+1))
    z = np.zeros((n+1))
    r = np.zeros((n+1))
    s[0] = N
    z[0] =1
    r[0] = 0
    for i in range (n-1):
        s[i+1] = s[i]+dt*(-b*s[i]*z[i]-d*s[i]+c*z[i])
        e[i+1]= e[i]+dt*(b*s[i]*z[i]-ze*e[i]-d*e[i])
        z[i+1] = z[i]+dt*(-a*s[i]*z[i]+ze*e[i]-c*z[i])
        r[i+1] = r[i]+dt*(a*s[i]*z[i]+d*s[i]+d*e[i])
        if s[i+1]<0 or s[i+1] >N:
            s[i+1]=0
            break
        if e[i+1] > N or e[i+1] < 0:
            e[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:
            break
    return (t,s,r,z,e,i+2)

1 个答案:

答案 0 :(得分:0)

对于Tkinter的列表框,您必须使用my_listbox.curselection()来检索当前选择的内容。我看到你在Double()函数中使用了它。

要稍后使用此值,您应该让Double()返回一些内容。毕竟这是一种方法。

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

    # this is the new part
    return value 

或者如果你刚才谈到在同一个班级中使用这些变量,你应该使用self.

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

现在,您可以在班级的任何位置访问self.selectionself.value。但是你必须在前面添加self.,否则它将无法访问正确的变量。