, если я запустил эту программу, я не смогу получить никаких значений в своих пользовательских записях. Кроме того, я не уверен, почему мой Tkinter производит 2 windows. Может ли кто-нибудь помочь?
Вот пример кода.
Справочная информация: я делаю интерактивное приложение для уравнений Лоренца, чтобы показать траекторию бабочки хаоти c в фазовом пространстве. В моем окне Tkinter я добавил 3 записи, чтобы пользователь мог выбрать для определенного параметра, и я хочу получить эти значения, но по какой-то причине в функции click1 он не печатает полученные значения.
import sys
import traceback
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
from random import randint
import math
from tkinter import *
import tkinter as tk
import matplotlib
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg, NavigationToolbar2Tk
from matplotlib.figure import Figure
from matplotlib import style
matplotlib.use("TkAgg")
class LorenzAttractorRungeKutta(tk.Frame):
DT = 1e-3 # Differential interval
STEP = 100000 # Time step count
def __init__(self):
global user_r_entry
global user_sigma_entry
global user_b_entry
super(LorenzAttractorRungeKutta, self).__init__()
self.X_0, self.Y_0, self.Z_0 = 0,0,0
self.root = Tk()
self.root.grid()
self.root.title("Lorenz Simulation")
self.root.geometry = ("500x500")
self.root.resizable = (False, False)
self.res = [[], [], []]
self.root.graphframe = LabelFrame(master = self.root, text = "Phase Space")
self.root.label1 = Label(self.root.graphframe, text="Graph", height = 3, width = 15).grid(row=5, column=0, columnspan=10)
#self.root.graphframe = LabelFrame(master = self.root, text = "Phase Space")
#self.root.label1 = Label(self.root.graphframe, text="Graph", height = 3, width = 15).grid(row=5, column=0, columnspan=10)
user_r_entry = IntVar()
r_entry = Entry(self.root, textvariable = user_r_entry).grid(row = 1, column = 0)
self.root.r_label = Label(self.root, text="r value", height = 1, width = 12).grid(row=2, column=0, columnspan=1)
user_sigma_entry = IntVar()
sigma_entry = Entry(self.root, textvariable = user_sigma_entry).grid(row = 1, column = 1)
self.root.sigma_label = Label(self.root, text="sigma value", height = 1, width = 12).grid(row=2, column=1, columnspan=1)
user_b_entry = IntVar()
b_entry = Entry(self.root, textvariable = user_b_entry).grid(row = 1, column = 2)
self.root.b_label = Label(self.root, text="b value", height = 1, width = 12).grid(row=2, column=2, columnspan=1)
self.plot_button = Button (self.root, command = self.click1, height = 2, width = 4).grid(row = 3, column = 1)
self.mainloop()
def click1(self):
global r_info
global sigma_info
global b_info
r_info = user_r_entry.get()
sigma_info = user_sigma_entry.get()
b_info = user_b_entry.get()
print (r_info, sigma_info, b_info)
def plot(self):
global user_r_entry
global user_sigma_entry
global user_b_entry
global r_info
global sigma_info
global b_info
print (r_info,sigma_info,b_info)
tk.Frame.__init__(self, self.root)
try:
xyz = [self.X_0, self.Y_0, self.Z_0]
for _ in range(self.STEP):
k_0 = self.__lorenz(xyz)
k_1 = self.__lorenz([x + k * self.DT / 2 for x, k in zip(xyz, k_0)])
k_2 = self.__lorenz([x + k * self.DT / 2 for x, k in zip(xyz, k_1)])
k_3 = self.__lorenz([x + k * self.DT for x, k in zip(xyz, k_2)])
for i in range(3):
xyz[i] += (k_0[i] + 2 * k_1[i] + 2 * k_2[i] + k_3[i]) \
* self.DT / 6.0
self.res[i].append(xyz[i])
#print (self.res[1])
f = Figure(figsize=(10,10), dpi=100)
a = f.add_subplot(111)
a.plot(self.res[0], self.res[1])
canvas = FigureCanvasTkAgg(f, self)
canvas.draw()
canvas.get_tk_widget().pack(side=tk.TOP, fill=tk.BOTH, expand=True)
except Exception as e:
raise
def __lorenz(self, xyz):
global r_info
global sigma_info
global b_info
p = sigma_info
r = r_info
b = b_info
try:
return [
-p * xyz[0] + p * xyz[1],
-xyz[0] * xyz[2] + r * xyz[0] - xyz[1],
xyz[0] * xyz[1] - b * xyz[2]
]
except Exception as e:
raise
if __name__ == '__main__':
try:
LorenzAttractorRungeKutta()
except Exception as e:
traceback.print_exc()
sys.exit(1)