您如何使用tkinter输入框来创建变量?

时间:2018-06-21 14:03:57

标签: python variables tkinter tkinter-entry

我目前正在尝试创建“轨道模拟器”,这部分代码就是其中的一部分。但是,当我尝试运行它时会发生错误。 get()函数似乎不起作用,因为它只是输出不存在的内容。 我真的为此感到难过。

import tkinter
runwin = tkinter.Tk()
runwin.title("Orbit Sim")
runwin.geometry("320x320")
def run21():
    dt=ent21.get("1.0")
    tg=ent22.get("1.0")
    xz=ent23.get("1.0")
    yz=ent24.get("1.0")
    velz=ent25.get("1.0")
    runwin.destroy()
lbl21 = tkinter.Label(runwin, text="How long to simulate for?").pack()
ent21 = tkinter.Entry(runwin).pack()
lbl22 = tkinter.Label(runwin, text="How many seconds pass per check?").pack()
ent22 = tkinter.Entry(runwin).pack()
lbl23 = tkinter.Label(runwin, text="Starting Positon? Please state X then Y.").pack()
ent23 = tkinter.Entry(runwin).pack()
ent24 = tkinter.Entry(runwin).pack()
lbl24 = tkinter.Label(runwin, text="Starting Velocity").pack()
ent25 = tkinter.Entry(runwin).pack()
btn21 = tkinter.Button(runwin, text="Submit", command=run21).pack()
runwin.mainloop()
t=0
while t < dt:
    r3, t =m.sqrt((xz*xz)+(yz*yz)), t+tg

P.S。我不是编码方面的天才,编写代码的方式几乎是我没有足够注释就能理解的唯一方法。

2 个答案:

答案 0 :(得分:0)

如果您要使用该小部件,请不要定义小部件并在同一行上使用布局管理器。

即不要这样做

ent21 = tkinter.Entry(runwin).pack()

这样做

ent21 = tkinter.Entry(runwin)
ent21.pack()

喜欢

import tkinter
runwin = tkinter.Tk()
runwin.title("Orbit Sim")
runwin.geometry("320x320")
dt = ""
tg = ""
xz = ""
yz = ""
velz = ""
def run21():
    global dt, tg, xz, yz, velz
    dt=ent21.get()
    tg=ent22.get()
    xz=ent23.get()
    yz=ent24.get()
    velz=ent25.get()
    runwin.destroy()
lbl21 = tkinter.Label(runwin, text="How long to simulate for?").pack()
ent21 = tkinter.Entry(runwin)
ent21.pack()
lbl22 = tkinter.Label(runwin, text="How many seconds pass per check?").pack()
ent22 = tkinter.Entry(runwin)
ent22.pack()
lbl23 = tkinter.Label(runwin, text="Starting Positon? Please state X then Y.").pack()
ent23 = tkinter.Entry(runwin)
ent23.pack()
ent24 = tkinter.Entry(runwin)
ent24.pack()
lbl24 = tkinter.Label(runwin, text="Starting Velocity").pack()
ent25 = tkinter.Entry(runwin)
ent25.pack()
btn21 = tkinter.Button(runwin, text="Submit", command=run21).pack()

runwin.mainloop()

其他评论者之一也是正确的。 .mainloop之后的任何代码只有在关闭窗口之后才能运行。考虑在run21函数中执行此操作,以便在按下按钮时发生。

由于条目小部件的get方法不接受任何参数,因此我从您的获取中删除了"1.0"

还请考虑为变量更好地命名。请考虑使用ent21而不是entrySimulationTime或考虑使用ent24。这样,您的代码将更容易理解。

编辑:添加了全局变量以扩展dt等的范围。

答案 1 :(得分:0)

我有3个问题。

第一个问题是您直接在小部件上使用了网格管理器,这将导致您的get()方法出错。这是因为网格管理器正在返回None。 我们可以通过在新行中调用网格管理器来解决此问题。

2您正在将"1.0"放入get方法中,这会出错。 像这样get()那样留空。

第三,您需要定义要在程序关闭后在tkinter实例外部运行的变量。然后,您需要在函数中设置全局调用。

看看下面的代码:

import tkinter
# the 5 below variables are listed outside of tkinter so your while statement
# after the mainloop can use the data.
dt = ""
tg = ""
xz = ""
yz = ""
velz = ""

runwin = tkinter.Tk()
runwin.title("Orbit Sim")
runwin.geometry("320x320")
def run21():
    # this global is needed to tell the run21 function the variables are
    # in the global namespace.
    global dt, tg, xz, yz, velz
    dt=ent21.get()
    tg=ent22.get()
    xz=ent23.get()
    yz=ent24.get()
    velz=ent25.get()
    runwin.destroy()
lbl21 = tkinter.Label(runwin, text="How long to simulate for?").pack()
ent21 = tkinter.Entry(runwin)
ent21.pack()
lbl22 = tkinter.Label(runwin, text="How many seconds pass per check?").pack()
ent22 = tkinter.Entry(runwin)
ent22.pack()
lbl23 = tkinter.Label(runwin, text="Starting Positon? Please state X then Y.").pack()
ent23 = tkinter.Entry(runwin)
ent23.pack()
ent24 = tkinter.Entry(runwin)
ent24.pack()
lbl24 = tkinter.Label(runwin, text="Starting Velocity").pack()
ent25 = tkinter.Entry(runwin)
ent25.pack()
btn21 = tkinter.Button(runwin, text="Submit", command=run21).pack()
t=0
runwin.mainloop()

print(dt, tg, xz, yz, velz)
# commented out as it is not testable without knowing what "m" is.
# while t < dt:
#     r3, t = m.sqrt((xz*xz)+(yz*yz)), t+tg