2013-10-13 2 views
0

필요한 경우 전체 GUI와 실행에 필요한 파일을 게시 할 수 있습니다. 여러 다른 모델에 해당하는 프레임에 수학 방정식을 삽입하려고합니다. 이러한 모든 프레임은 응용 프로그램 시작시로드됩니다. 이것은 WIP이므로 그리기위한 방정식은 ifs를 사용하여 하드 코딩되며 나중에 외부 설정 파일 (GUI의 나머지 부분에 대해 이미 수행 한)에 의해 제공됩니다.Matplotlib 숫자가 프레임과 함께 이동하지 않습니다.

'frame'변수에 값을 할당 한 다음 frame.tkraise()를 사용하여 선택한 변수를 각 프레임 상단에 올리면 탐색하지만 수학 공식은 프레임과 함께 이동하지 않습니다. 방정식이있는 캔버스는 메인 프레임의 다른 모든 것들 위에 남습니다. 결과적으로 프레임을 움직 였음에도 불구하고 마지막 모델이 항상 위에 놓이는 방정식이 생깁니다.

방정식이 포함 된 프레임을 따라갈 수 있도록 코드를 어떻게 다시 말합니까? 파이썬 @ Freenode, 구글 (~ 50 페이지 다른 쿼리) 및 문서를 통해 (불행히도 Tkinter 매우 부족한) 검색을 시도했다. 당신이 볼 수 있듯이

class Model(tk.Frame): 
    def __init__(self, parent, controller, model_name): 
     tk.Frame.__init__(self, parent) 
     self.label = tk.Label(self, text="Model: %s" % (model_name)) 
     self.label.grid(row=0, column=0) 

     #self.f = mplfig.Figure(figsize=(3.59,3.35)) 

     print model_name 

     if model_name == 'LotkaVolterra': 
      self.eq1 = mplfig.Figure(figsize=(3.59,3.35)) 
      #self.eq1 = self.f#.add_axes([0.0, 0.0, 1.0, 1.0], axisbg='white') 
      self.eq1.text(0.05, 0.875, r'$\frac{d[X]}{dt}=k_{1}[X]-k_{2}[X][Y]$', fontsize=14) 
      self.eq1.text(0.05, 0.750, r'$\frac{d[Y]}{dt}=-k_{3}[Y]+k_{4}[X][Y]$', fontsize=14) 
      self.eq1.text(0.05, 0.625, r'$A+X\rightarrow 2X \;(k_{1})$', fontsize=14) 
      self.eq1.text(0.05, 0.500, r'$X+Y\rightarrow 2Y \;(k_{2} \; and \; k_{4})$', fontsize=14) 
      self.eq1.text(0.05, 0.375, r'$Y\rightarrow B \;(k_{3})$', fontsize=14) 
      #self.eq1.set_xticklabels([]) 
      #self.eq1.set_yticklabels([]) 
      #self.eq1.set_xticks([]) 
      #self.eq1.set_yticks([]) 
      self.canvas = tkagg.FigureCanvasTkAgg(self.eq1, master=parent) 
      #self.canvas.show() 
      self.canvas.get_tk_widget().grid(row=1) 

     elif model_name == 'Brusselator': 
      self.eq2 = mplfig.Figure(figsize=(3.59,3.35)) 
      #self.eq2 = self.f#.add_axes([0.0, 0.0, 1.0, 1.0], axisbg='white') 
      self.eq2.text(0.05, 0.875, r'$\frac{d[X]}{dt}=k_{1}[A]-k_{2}[B][X]+k_{3}[X]^{2}[Y]-k_{4}[X]$', fontsize=14) 
      self.eq2.text(0.05, 0.750, r'$\frac{d[Y]}{dt}=k_{2}[B][X]-k_{3}[X]^{2}[Y]$', fontsize=14) 
      self.eq2.text(0.05, 0.625, r'$A\rightarrow X \;(k_{1})$', fontsize=14) 
      self.eq2.text(0.05, 0.500, r'$B+X\rightarrow Y+D \;(k_{2})$', fontsize=14) 
      self.eq2.text(0.05, 0.375, r'$2X+Y\rightarrow 3X \;(k_{3})$', fontsize=14) 
      self.eq2.text(0.05, 0.250, r'$X\rightarrow E \;(k_{4})$', fontsize=14) 
      #self.eq2.set_xticklabels([]) 
      #self.eq2.set_yticklabels([]) 
      #self.eq2.set_xticks([]) 
      #self.eq2.set_yticks([]) 
      self.canvas = tkagg.FigureCanvasTkAgg(self.eq2, master=parent) 
      #self.canvas.show() 
      self.canvas.get_tk_widget().grid(row=1) 

     elif model_name == 'Oregonator': 
      self.eq3 = mplfig.Figure(figsize=(3.59,3.35)) 
      #self.eq3 = self.f#.add_axes([0.0, 0.0, 1.0, 1.0], axisbg='white') 
      self.eq3.text(0.05, 0.875, r'$\frac{d[X]}{dt}=k_{1}[A][Y]-k_{2}[X][Y]+k_{3}[A][X]-2k_{4}[X]^{2}$', fontsize=13) 
      self.eq3.text(0.05, 0.750, r'$\frac{d[Y]}{dt}=-k_{1}[B][X]-k_{2}[X][Y]+0.5fk_{5}[B][Z]$', fontsize=13) 
      self.eq3.text(0.05, 0.625, r'$\frac{d[Y]}{dt}=2k_{3}[A][X]-k_{5}[B][Z]$', fontsize=13) 
      self.eq3.text(0.05, 0.500, r'$A+Y\rightarrow X+P \;(k_{1})$', fontsize=13) 
      self.eq3.text(0.05, 0.400, r'$X+Y\rightarrow 2P \;(k_{2})$', fontsize=13) 
      self.eq3.text(0.05, 0.300, r'$A+X\rightarrow 2X+2Z \;(k_{3})$', fontsize=13) 
      self.eq3.text(0.05, 0.200, r'$2X\rightarrow A+P \;(k_{4})$', fontsize=13) 
      self.eq3.text(0.05, 0.100, r'$B+Z\rightarrow fY \;(k_{5})$', fontsize=13) 
      #self.eq3.set_xticklabels([]) 
      #self.eq3.set_yticklabels([]) 
      #self.eq3.set_xticks([]) 
      #self.eq3.set_yticks([]) 
      self.canvas = tkagg.FigureCanvasTkAgg(self.eq3, master=parent) 
      #self.canvas.show() 
      self.canvas.get_tk_widget().grid(row=1) 

     #self.canvas = tkagg.FigureCanvasTkAgg(self.f, master=parent) 
     #self.canvas.show() 
     #self.canvas.get_tk_widget().grid(row=1) 
     self.grid() 

, 모델 클래스의 인스턴스 (해당 모델 이름 (라벨이 제대로 이동)과 라벨을 가지고 LaTeX의 방정식과 화학 반응의 설정합니다 : 여기

코드의 발췌입니다 이들은 정확하게 움직이지 않는다). 이것을 어떻게 바꾸어야합니까? 나는 아무 소용이없는 다양한 접근법을 시도했다. 라벨을 사용하면 탐색 문제는 분명히 해결되지만 tk.Label은 LaTeX를 이해하지 못합니다. 또한 tk.Canvas도 마찬가지입니다. MatPlotLib Tkinter 백엔드 만 LaTeX를 인식합니다.

프레임이 위쪽으로 이동하면 LaTeX 방정식이 tk.Labels을 따라 가기를 원합니다.

답변

1

캔버스를 만들 때 master=parent을 작성하십시오. masterself으로 설정 했습니까?

+0

와우 ... 고마워! 구호 = 캔버스에 SUNKEN을 추가하는 방법이 있습니까? – user2126752

+0

마지막 캔버스 주위에 검은 색 프레임이 나타납니다 (탐색 기능이 작동합니다, 감사합니다!). 또한, 메인 프레임 윈도우에서 self.quit() 및 self.destroy()를 사용하여 응용 프로그램을 종료하면 "치명적인 파이썬 오류 : PyEval_RestoreThread : NULL tstate"가 표시됩니다. 당신이 볼 수 있도록 전체 코드를 제시해야합니까? – user2126752

+0

@ user2126752 : matplotlib을 사용한 적이 없기 때문에, matplotlib에서 오는 것처럼 보이는 치명적인 오류를 해결할 수는 없습니다. –

관련 문제