tkinter - 如何从 tkinter 上的 Entry 获取值?
问题描述
如果我运行这个程序,我似乎无法在我的用户条目上获得任何值。另外,我不确定为什么我的 Tkinter 会产生 2 个窗口。任何人都可以帮忙吗?
这是示例代码。
背景:我正在为洛伦兹方程制作一个交互式应用程序,以显示相空间中的混沌蝴蝶轨迹。在我的 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)
解决方案
推荐阅读
- angular - 过滤一个可观察的
- dataweave - 导入 java utils 不起作用 - Dataweave、Mulesoft
- rust - Rust 编译非常慢。难道我做错了什么?
- angular - 如何自定义星云主题服务变量?
- entity-framework - 获取子列表可以为空的列表项
- python - playhouse.pool.MaxConnectionsExceeded:超过了多线程的最大连接数
- c# - iTextSharp 创建一个 pdf 但只写英文单词/字母
- python - 如何使用普通文本加入列
- jinja2 - 如何隐式地拥有全局自定义宏使用上下文?
- javascript - 对机器人发布的消息做出反应