Уведомления

Группа в Telegram: @pythonsu

#1 Янв. 3, 2015 21:22:34

Igor-dis
Зарегистрирован: 2014-12-14
Сообщения: 14
Репутация: +  0  -
Профиль   Отправить e-mail  

Спотыкается на встроенной функции

Есть такой кусок программы из учебника:

import Tkinter
import math
#
tk=Tkinter.Tk()
canvas=Tkinter.Canvas(tk, height=360, width=480, background="#eeeeff",
					borderwidth=2).pack(side="bottom")
#
def plot_x_axe(x0, y0, x1):
	x_axe =[]
	xx=(x0, y0)
	x_axe.append(xx)
	xx=(x1, y0)
	x_axe.append(xx)
	canvas.create_line(x_axe, fill="black", width=2)

При запуске выдает ошибку:

AttributeError: ‘NoneType’ object has no attribute ‘create_line’

Из-за чего вылазит эта ошибка?

Офлайн

#2 Янв. 3, 2015 21:30:54

4kpt_III
Зарегистрирован: 2014-12-22
Сообщения: 999
Репутация: +  39  -
Профиль   Отправить e-mail  

Спотыкается на встроенной функции

1. Тема должна быть не здесь, а в разделе gui (это на будущее)
2. Метода .pack() возвращает None. Ну а None, естественно, не имеет метода .create_line
Чтобы решить это - нужно разделить создание виджета и его упаковку (размещение одним из менеджеров геометрии).

Ваш код:

import Tkinter
import math
#
tk = Tkinter.Tk()
canvas = Tkinter.Canvas(tk, height=360, width=480, background="#eeeeff", borderwidth=2)
canvas.pack(side="bottom")
#
def plot_x_axe(x0, y0, x1):
    x_axe = []
    xx = (x0, y0)
    x_axe.append(xx)
    xx = (x1, y0)
    x_axe.append(xx)
    canvas.create_line(x_axe, fill="black", width=2)

P.S. Будут вопросы - пишите…

Отредактировано 4kpt_III (Янв. 3, 2015 21:58:01)

Офлайн

#3 Янв. 3, 2015 21:43:12

Igor-dis
Зарегистрирован: 2014-12-14
Сообщения: 14
Репутация: +  0  -
Профиль   Отправить e-mail  

Спотыкается на встроенной функции


Извиняюсь, тупанул к вечеру.

Отредактировано Igor-dis (Янв. 3, 2015 21:48:06)

Офлайн

#4 Янв. 3, 2015 21:48:14

4kpt_III
Зарегистрирован: 2014-12-22
Сообщения: 999
Репутация: +  39  -
Профиль   Отправить e-mail  

Спотыкается на встроенной функции

Для особо невнимательных повторю.
Вы вызываете метод класса Canvas, который возвращает None, поэтому с переменной canvas связывается не экземпляр Canvas (объект canvas), а результат выполнения метода .pack(), т.е. None. Итого в результате:

canvas = Tkinter.Canvas(tk, height=360, width=480, background="#eeeeff", borderwidth=2).pack(side="bottom")

Равносильно

canvas = None

Для аналогии: метод pack() работает так же как метод .append() у списка. Этот метод изменяет сам объект и, естественно, возвращает None.

Отредактировано 4kpt_III (Янв. 3, 2015 21:49:23)

Офлайн

#5 Янв. 3, 2015 21:49:02

4kpt_III
Зарегистрирован: 2014-12-22
Сообщения: 999
Репутация: +  39  -
Профиль   Отправить e-mail  

Спотыкается на встроенной функции

Не редактируйте свои посты… Это плохой тон!!! Если кому-то нужно что-то узнать, то не видно диалога, и нельзя собрать последовательность событий.

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version