2015-03-10 5 views
0

В настоящее время я застрял в решающей точке программы - мы создали графический интерфейс, который позволяет пользователю выбирать, какую модель популяции они хотят использовать, а затем позволяет им вводить значения в вводах. Теперь я хочу, чтобы эти значения были повторно использованы в следующей функции. Вот как я представляю, как это должно работать.Значения повторного использования, введенные в GUI Tkinter для дальнейшего программирования

Если был выбран х:

  • сделать это с помощью введенных значений
  • нарисовать этот граф

Вот фактический код для графического интерфейса:

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

Вот проблема lems:

  • Я понятия не имею, как получить значение того, что было выбрано в списке, для повторного использования для «если».
  • Я действительно не знаю, как получить его числовые значения того, что было помещено в поля ввода. Я действительно понимаю, что мне нужно использовать .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) 
+0

После того, как вы выясните, как получить значения из графического интерфейса, вы можете вызывать функции для последующей обработки, сначала импортируя скрипт, в котором они находятся, то есть «import othermodule», а затем называя их с помощью 'othermodule.zombies (.. arguments-from-gui ...)'. Этот вызов может быть выполнен, когда будет нажата новая кнопка, которую вы должны добавить в свой графический интерфейс. – martineau

ответ

0

Для Listbox 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.selection, self.value где-нибудь в классе. Но вы должны префикс их self., иначе он не получит доступ к правильной переменной.

+0

Я использовал этот в функции «двойной». Но как мне получить наш GUI в другую функцию? – Doule

+0

Я обновил свой ответ, чтобы лучше отразить вопрос. – ProfOak