Вылезает ошибка _tkinter.TclError: bad screen distance ""
Программа должна принимать 4 координаты и рисовать по ним фигуру, которую выбрал пользователь. Но при запуске вылезает ошибка "_tkinter.TclError: bad screen distance "
from tkinter import *
root = Tk()
c = Canvas(root)
def new_window(): # создает окно со всеми нужными кнопка и полями для ввода
win = Toplevel()
e1x = Entry(win)
e1x.pack()
e1x = e1x.get() # для ввода координат начала отрезка
e1y = Entry(win)
e1y.pack()
e1y = e1y.get()
e2x = Entry(win) # для ввода координат конца отрезка
e2x.pack()
e2x = e2x.get()
e2y = Entry(win)
e2y.pack()
e2y = e2y.get()
def draw():
c.create_line(e1x, e1y, e2x, e2y)
draw()
b = Button(text='Нарисовать', command=new_window())
root.mainloop()
Ответы (2 шт):
Автор решения: XijPRX
→ Ссылка
Вы забыли элемент IntVar().
from tkinter import *
root = Tk()
c = Canvas(root)
win = Toplevel()
s1x = IntVar()
s1y = IntVar()
s2x = IntVar()
s2y = IntVar()
e1x = Entry(win, textvariable = s1x)
e1x.pack()
e1y = Entry(win, textvariable = s1y)
e1y.pack()
e2x = Entry(win, textvariable = s2x)
e2x.pack()
e2y = Entry(win, textvariable = s2y)
e2y.pack()
def draw():
c.create_line(s1x.get(), s1y.get(), s2x.get(), s2y.get())
b = Button(text='Нарисовать', command=draw)
b.pack()
c.pack()
root.mainloop()
Автор решения: insolor
→ Ссылка
Ошибки в коде:
Скобки при передаче обработчика в объект кнопки
command=new_window()- из-за этого обработчик вызывается сразу, до нажатия на кнопку. Правильная привязка функции-обработчика нажатия:b = Button(text='Нарисовать', command=new_window)Вы создаете текстовые поля, и сразу из них пытаетесь получить значения. Сразу после создания в текстовых полях пусто, отсюда ошибка. Координаты нужно получать не сразу, а например после нажатия на кнопку, после этого уже рисовать.
- В текстовых полях лежат строки, а координаты концов отрезка должны быть числами.
Исправленный код:
from tkinter import *
root = Tk()
c = Canvas(root)
c.pack()
def new_window(): # создает окно со всеми нужными кнопка и полями для ввода
win = Toplevel()
# для ввода координат конца отрезка
e1x = Entry(win)
e1x.pack()
e1y = Entry(win)
e1y.pack()
# для ввода координат начала отрезка
e2x = Entry(win)
e2x.pack()
e2y = Entry(win)
e2y.pack()
def draw():
x1 = int(e1x.get())
y1 = int(e1y.get())
x2 = int(e2x.get())
y2 = int(e2y.get())
c.create_line(x1, y1, x2, y2)
Button(win, text='Нарисовать', command=draw).pack()
Button(text='Получить координаты', command=new_window).pack()
root.mainloop()