Как вы используете поля ввода tkinter для создания переменной?

1

В настоящее время я пытаюсь создать "симулятор орбиты", и эта часть кода является его частью. Однако ошибки возникают, когда я пытаюсь запустить его. Функция 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

PS Я не гений в кодировании, и способ, которым я написал этот код, в значительной степени единственный способ понять это без достаточных заметок.

Теги:
variables
tkinter
tkinter-entry

2 ответа

0
Лучший ответ

У вас есть 3 проблемы, которые я вижу.

Первая проблема заключается в том, что вы используете диспетчер сетки непосредственно в виджете, и это приведет к ошибке метода get(). Это связано с тем, что диспетчер grid возвращает None. Мы можем исправить это, вызвав диспетчера сетки на новой строке.

2nd вы помещаете "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
  • 0
    Предположительно, m является import math as m .
  • 0
    @ scotty3785 Может быть. Это не было в их списке импорта, поэтому я не установил эту связь. Я не так много сделал с библиотекой математики.
Показать ещё 1 комментарий
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 чтобы это произошло при нажатии кнопки.

Я удалил "1.0" из вашего get, так как метод get виджета ввода не принимает никаких аргументов.

Также, пожалуйста, подумайте о том, чтобы лучше назвать ваши переменные. Вместо ent21 рассмотрим entrySimulationTime или вместо ent24 рассмотрим entryStartingPosY. Ваш код будет намного легче понять.

EDIT: добавлены глобальные расширения для расширения области dt и т.д.

  • 0
    Также укажите, что вы удалили «1.0» из метода get.
  • 0
    @dbaker Трудно диагностировать проблему, так как я не вижу, что вы изменили. Ошибка указывает, что dt не существует в этот момент выполнения или не находится в области видимости. Вы переместили while t < dt в функцию run21 ?
Показать ещё 7 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню